неопределенный символ: memset, версия GLIBC_2.2.5

0

Я получаю это:

./ListBench: ошибка поиска символа: /usr/lib/libfoo.so: undefined symbol: memset, версия GLIBC_2.2.5

Почему memset undefined в libc.so?

# 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
    Показать вывод 'objdump -T /lib/x86_64-linux-gnu/libc.so.6 | grep memset '.
  • 0
    Это foo.so или libfoo.so ? Возможно, у вас есть два разных файла!
Показать ещё 3 комментария
Теги:
linker-errors
undefined-reference

2 ответа

0
Лучший ответ

Проблема была неправильным порядком связывания опций (-lfoo должен был быть последним). Реорганизация их решила проблему.

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 может быть либо встроен, либо магически скомпилирован как __builtin_memset (см. другие встроенные функции GCC). На моем Debian/Sid/x86-64 memset есть макрос в /usr/include/bits/string.h включенный из <string.h>

Проверьте, что у вас действительно есть #include<string.h> в каждом исходном файле C, вызывающем memset... Не забывайте всегда передавать -Wall в gcc (он предупреждал бы, если бы вы забыли включение)...

  • 0
    спасибо, я, по сути, получаю тот же вывод, что и вы на nm -D. Любая идея, как избежать неопределенной ошибки времени выполнения символа в этом случае?
  • 0
    Покажите исходный код вашего вызова foo.so memset и как вы его компилируете.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню