共享库怎么可能定义一个函数但不能link呢?
how is it possible for shared library to define a function but can't link to it?
这怎么可能:
>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
不能link到"foobar",因为foobar.so定义"foobar"为"text"区域的局部符号,只导出全局符号
nm 输出的第二列给出了符号类型。小写表示本地,大写表示全局。仅导出全局符号。参见 man nm(1)
除了出色的@Tibrogargan 回答之外,您可以尝试使用 readelf
实用程序检查绑定,全局符号与本地符号相比更清晰一些 - 它实际上会打印 GLOBAL 或 LOCAL
> readelf --symbols foobar.so
这怎么可能:
>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
不能link到"foobar",因为foobar.so定义"foobar"为"text"区域的局部符号,只导出全局符号
nm 输出的第二列给出了符号类型。小写表示本地,大写表示全局。仅导出全局符号。参见 man nm(1)
除了出色的@Tibrogargan 回答之外,您可以尝试使用 readelf
实用程序检查绑定,全局符号与本地符号相比更清晰一些 - 它实际上会打印 GLOBAL 或 LOCAL
> readelf --symbols foobar.so