2

我有一个链接问题。我需要链接一个共享库libfoo.so,该库依赖于read我想在文件 read.c 中定义自己的函数。

我将所有内容编译并链接在一起,但在运行时出现错误

/home/bar/src/libfoo.so: undefined symbol: sread.

nm 报告符号已定义

$nm baz | grep sread
  00000000000022f8 t sread

但 ldd 报告符号未定义

$ldd -r baz | grep sread 
undefined symbol: sread (/home/bar/src/libfoo.so)

是什么赋予了?libfoo.so 是一个共享库这一事实有什么问题吗?

4

3 回答 3

14

首先,定义一个名为“read”的函数是个坏主意(TM),因为它是所有 UNIXen 上的标准 libc 函数。执行此操作时,程序的行为是未定义的。

其次,read您在其中定义的函数libbaz.so标有't'innm输出。这意味着这个函数是本地的(在外面不可见libbaz.so)。'T'全局函数用标记nm

'static int read(...)'在read.c中定义的时候用过吗?如果没有,您是否在编译和链接时使用了链接器脚本,或者attribute((visibility(hidden))),或者可能-fvisibility=hidden在命令行上libbaz.so

于 2009-06-03T05:03:28.313 回答
1

上面的错误也可能出现在C代码用G++编译,然后链接的时候。G++ 执行名称修改,因此实际符号可能类似于“_Zsds_[function_name]_”,导致链接器在搜索未修改名称时阻塞。

我今天遇到了同样的行为,除了我的问题在Wikipedia上概述的操作后得到解决。基本上,使用 C++ 编译器编译的 C 代码将在符号表中具有“损坏”的名称,从而导致 C 样式的符号解析失败。

于 2013-08-30T18:12:44.480 回答
-1

构建共享库时,您需要从同一个库或另一个(共享)库中解析所有未定义的符号。链接器不会使用应用程序中的符号解析库中的未定义符号。

于 2009-06-03T03:10:38.623 回答