共享库如何定义函数但无法链接到它?

时间:2016-03-22 23:04:49

标签: linux gcc shared-libraries

这怎么可能:

>nm --defined-only foobar.so | grep foobar
000000000003c7c0 t foobar
>gcc foobar.c foobar.so
foobar.c:(.text+0x19): undefined reference to `foobar'
collect2: ld returned 1 exit status

2 个答案:

答案 0 :(得分:1)

您无法链接到“foobar”,因为foobar.so将“foobar”定义为“文本”区域中的本地符号,并且仅导出全局符号

nm输出的第2列给出了符号类型。小写表示本地,大写表示全局。仅导出全局符号。见man nm(1)

答案 1 :(得分:0)

除了优秀的@Tibrogargan答案之外,您可以尝试使用readelf实用程序检查绑定,它更清楚地表示全局vs本地符号 - 它实际上会打印GLOBAL或LOCAL

> readelf --symbols foobar.so