使克隆的线程 pthread 兼容

Making a clone'd thread pthread compatible

我正在 Linux x86-64 上用 C 编程。我正在使用一个库,该库通过原始 clone 系统调用而不是使用 pthread_create 创建多个线程。这些线程 运行 库内部的低级代码。

我想挂钩这些线程之一来反省它的行为。挂钩代码很容易,但我发现我几乎无法调用 libc 中的任何内容,因为未配置线程状态。 pthread_create 通常是将一堆数据插入索引为fs: 的线程本地存储区。例如,其中一些数据对于 libc 的功能至关重要,例如函数指针加密密钥 (pointer_guard) 和区域设置指针。

所以我的问题是:我可以通过任何机制将 clone 的线程升级到完整的 pthread 吗?如果没有,有没有什么方法可以从 clone 线程(例如 printftoupper 等需要 libc 的线程本地数据)调用 C 函数?

Some of that data, for example, is essential to libc's function, such as the function pointer encryption key (pointer_guard) and locale pointer.

正确。不要忘记 errno,它也在其中。

can I upgrade a clone'd thread to a full pthread via any mechanism?

没有

is there any way that I can call C functions from a clone'd thread

没有

如果您有库的源代码,将直接 clone 调用替换为 pthread_create 应该相对容易。

如果您不这样做,但库以存档形式提供,您可以使用 obcopy --rename-symbol 将其 clone 调用重定向到替换(例如 my_clone) ,然后可以通过 pthread_create 创建一个新线程并调用该线程中的目标函数。这是否会成功很大程度上取决于图书馆对 clone.

细节的关心程度。

这也可能不值得麻烦。


一个更好的选择可能是在不调用 libc 的情况下 实现内省。由于您的 printftoupper 可能只需要处理 ASCIIC 语言环境,因此不难实现这些函数的有限版本并使用直接系统调用来编写输出。