У меня есть приложение, которое загружает некоторые плагины через dlopen
, в частности dlopen(name, RTLD_LAZY|RTLD_DEEPBIND)
.Есть некоторые плагины (предоставленные в двоичной форме), которые загружаются нормально, но плагин, который я пытаюсь создать, не может загрузить с ошибкой:
/opt/app/plugins/plugin.so: undefined symbol: Log_Modules
Все плагины ссылаются на этот символ и библиотеку, котораяпри условии, что он загружен в процессе.Однако запись, напечатанная objdump -D
, отличается.В загружаемых плагинах написано
00000000 DO *UND* 00000000 Log_Modules
, а в библиотеке, определяющей его, написано
000130dc g DO .data 00000004 Base Log_Modules
, а в модуле, который я создал, -
00000000 D *UND* 00000000 Log_Modules
Страница руководства по objdump
просто говорит, что флаг означает
Символ - это имя функции (F), файла (f) или объекта (O) или просто обычный символ (пробел).
, но я не вижу никаких намеков на разницу между объектом и нормальным символом.Итак,
- в чем разница,
- , что делает символ тем или иным на уровне языка C или C ++ или на уровне компоновщика, и
- действительно ли он долженсделать символ не разрешенным?