向libpthread.a添加新功能

时间:2018-07-16 01:52:55

标签: gcc pthreads gnu static-linking

我正在尝试修改pthread_create。具体来说,在create_thread中,我想删除CLONE_FILES标志。我也有需要正常pthread_create的功能。因此,我复制了pthread_create和create_thread的代码,将它们重命名为pthread_create_no_clone_files和create_thread_no_clone_files。在create_thread_no_clone_files中,我删除了CLONE_FILES标志。然后我编译它们,得到一个新的libpthread.a。以下是nm libpthread.a | grep pthread_create

的输出
0000000000002190 W pthread_create
0000000000002190 T __pthread_create_2_1
00000000000026a0 T pthread_create_no_clone_files
                 U __pthread_create
                 U __pthread_create

所以我在这里有pthread_create_no_clone_files。但是,当我尝试使用g++ pthread_test.c -static libpthread.a -o pthread_test构建测试程序时,出现以下链接错误

pthread_test.c:(.text+0x82): undefined reference to `pthread_create_no_clone_files(unsigned long*, pthread_attr_t const*, void* (*)(void*), void*)'

pthread_create_no_clone_files在我的程序中被向前声明。我觉得我需要在libpthread中的某个地方声明函数pthread_create_no_clone_files,但是我的知识告诉我,如果我的静态库中有入口,则应该可以链接它。我的理解有什么问题?

我也欢迎其他更好的方法来创建不带CLONE_FILES标志的pthread。谢谢。

1 个答案:

答案 0 :(得分:1)

您的程序正在使用C ++,并且您正在尝试访问C函数。您对该函数的前向声明必须包装在extern "C"块中。

除其他外,这会禁用名称修饰,以使参数类型不会出现在实际的符号名称中。实际上,出现在链接器错误消息中的参数类型就是为什么我认为这是问题所在。