我得到了这个:
./ ListBench:符号查找错误:/usr/lib/libfoo.so:未定义符号:memset,版本GLIBC_2.2.5
为什么在libc.so中未定义memset?
# ldd /usr/lib/foo.so
linux-vdso.so.1 => (0x00007fff167ff000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2f907eb000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f2f905e3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2f903c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2f90d86000)
# nm /lib/x86_64-linux-gnu/libc.so.6 | grep memset
nm: /lib/x86_64-linux-gnu/libc.so.6: no symbols
# objdump -T /lib/x86_64-linux-gnu/libc.so.6 | grep memset
00000000000904e0 g DF .text 0000000000000066 GLIBC_2.2.5 wmemset
00000000000f0620 g DF .text 0000000000000017 GLIBC_2.4 __wmemset_chk
0000000000083690 g iD .text 0000000000000029 GLIBC_2.2.5 memset
00000000000ecec0 g iD .text 0000000000000029 GLIBC_2.3.4 __memset_chk
# ldd --version
ldd (Debian EGLIBC 2.13-38) 2.13
foo.so使用
编译gcc -shared -g -std=gnu99 -pedantic -fPIC -Wall -Wno-unused -fno-strict-aliasing -o libfoo.so sync.o ksnap.o time_util.o bitmap.o -lc -pthread -lrt;
答案 0 :(得分:1)
寻找动态符号,例如
nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep memset
00000000000fb210 i __memset_chk
00000000000fe910 T __wmemset_chk
0000000000086c30 i memset
000000000009cb00 T wmemset
并且经常(取决于编译/usr/lib/foo.so
共享对象时使用的优化级别和编译器)memset
可以inlined或神奇地编译为__builtin_memset
(请参阅{ GCC的{3}}。在我的Debian / Sid / x86-64上memset
是来自/usr/include/bits/string.h
<string.h>
中的一个宏
请仔细检查您在调用#include<string.h>
的每个C源文件中确实memset
...不要忘记始终将-Wall
传递给gcc
(它会警告如果你忘了包含)...
答案 1 :(得分:0)
问题是链接选项的错误顺序(-lfoo必须是最后一个)。重新排序它们解决了这个问题。