使克隆的线程 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
线程(例如 printf
、toupper
等需要 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 的情况下 实现内省。由于您的 printf
和 toupper
可能只需要处理 ASCII
和 C
语言环境,因此不难实现这些函数的有限版本并使用直接系统调用来编写输出。
我正在 Linux x86-64 上用 C 编程。我正在使用一个库,该库通过原始 clone
系统调用而不是使用 pthread_create
创建多个线程。这些线程 运行 库内部的低级代码。
我想挂钩这些线程之一来反省它的行为。挂钩代码很容易,但我发现我几乎无法调用 libc 中的任何内容,因为未配置线程状态。 pthread_create
通常是将一堆数据插入索引为fs:
的线程本地存储区。例如,其中一些数据对于 libc
的功能至关重要,例如函数指针加密密钥 (pointer_guard
) 和区域设置指针。
所以我的问题是:我可以通过任何机制将 clone
的线程升级到完整的 pthread
吗?如果没有,有没有什么方法可以从 clone
线程(例如 printf
、toupper
等需要 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 的情况下 实现内省。由于您的 printf
和 toupper
可能只需要处理 ASCII
和 C
语言环境,因此不难实现这些函数的有限版本并使用直接系统调用来编写输出。