.so文件如何查找符号?

时间:2018-08-28 18:26:57

标签: c makefile undefined-symbol .so

我有一个.so文件,其中包含一些extern函数声明。 这些函数的定义在我所使用的二进制文件中 链接.so文件。但是在链接时我得到未定义的参考 错误。

是否可以在.so的makefile中提供一些路径以进行符号查找。

我使用objdump在.so(外部声明)和.o(实际定义不同的目录)中列出符号,而我发现两个地方都存在相同的符号。

/homes/uakash/cmd/usr/lib64$ objdump -T libcpld-cmd.so.0 | grep Parent

:::::

0000000000000000      D  *UND*  0000000000000000              _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::

/homes/uakash/src/usr/sbin/l$ objdump -t cpld_cmd.o | grep Parent

::::
00000000000000d0 g     F .text  0000000000000600  _Z29getParentCpldIFDOFromPreviousSt10shared_ptrIN3net74cpld14ParentCpldIFDOEERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
::::

2 个答案:

答案 0 :(得分:1)

您似乎对共享库的工作方式有误解。 .so文件包含定义,.o文件也是如此。一个用于动态链接,另一个用于静态链接。您需要同时使用一个,但不要同时使用。

例如,假设您提供了共享的共享库libcpld-cmd.so,例如,您希望将其链接到源main.c的代码,然后:

gcc main.c -lcpld-cmd.so -o myprogram

链接器将处理cpld-cmd.so来解析符号,但实际上不会链接其中的目标代码-这将是静态链接。

当您随后运行myprogram时,该库必须可用,并且OS加载程序会在运行时动态链接该库代码。

参考:http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

另一方面,如果您想静态链接,则可以链接cpld-cmd.o,而.so文件不起作用,也不是必需的-所有代码都静态链接到myprogram中。 / p>

gcc main.c cpld-cmd.o -o myprogram

答案 1 :(得分:0)

  

我有一个.so文件,其中包含一些外部函数声明。这些功能的定义以二进制形式存在,我在其中链接了.so文件。但是在链接时,我得到了未定义的参考错误。

然后,您应该使用-rdynamic标志(当然还有-ldl库来提供{{)来链接主程序(正在调用dlopen(3)或与库链接) 1}}(如果使用的话)。

也请阅读Drepper的How To Write Shared Libraries论文。