dlopen () .so не может найти символы в удаленном исполняемом файле - PullRequest
2 голосов
/ 25 мая 2011

У меня есть исполняемый файл в Linux - exe

Этот исполняемый файл содержит некоторые функции, которые используются в коде:

  • sendMsg
  • debugPrint

Затем я хочу динамически загрузить .so, который обеспечивает дополнительную функциональность для моего исполняемого файла.

В этой общей библиотеке я включаю заголовки для sendMsgи debugPrint.

Я загружаю эту общую библиотеку с dlopen() и создаю API с dlsym().

Однако на dlopen() я использую RTLD_NOW для разрешения всех символовво время загрузки.

Не удается указать, что он не может найти символ sendMsg.

Этот символ должен находиться в исполняемом файле, поскольку sendMsg.c скомпилирован там.

Однако , мой исполняемый файл удален процессом make.Таким образом, имело бы смысл, что dlopen не может найти символ.

Как я могу решить эту ситуацию?

  • Я мог бы встроить общие функции в статическую библиотеку и связатьэта статическая библиотека в exe и .so.Это увеличило бы размер кода: (
  • Я мог бы удалить зачистку exe, чтобы можно было найти символы
  • Сделайте некоторую магию компоновки во время компиляции, о которой я не знаю, поэтому.so знает, где находятся символы exe

1 Ответ

4 голосов
/ 25 мая 2011

man ld:

   -E
   --export-dynamic
   --no-export-dynamic
       When  creating  a  dynamically  linked  executable, using the -E option or the --export-dynamic option causes the linker to add all symbols to the dynamic symbol table.  The
       dynamic symbol table is the set of symbols which are visible from dynamic objects at run time.

       If you do not use either of these options (or use the --no-export-dynamic option to restore the default behavior), the dynamic symbol table will normally contain only  those
       symbols which are referenced by some dynamic object mentioned in the link.

       If  you  use "dlopen" to load a dynamic object which needs to refer back to the symbols defined by the program, rather than some other dynamic object, then you will probably
       need to use this option when linking the program itself.

       You can also use the dynamic list to control what symbols should be added to  the  dynamic  symbol  table  if  the  output  format  supports  it.   See  the  description  of
       --dynamic-list.

       Note  that  this  option  is  specific  to  ELF  targeted  ports.   PE  targets  support  a  similar function to export all symbols from a DLL or EXE; see the description of
       --export-all-symbols below.

Вы также можете передать параметр -rdynamic в gcc / g ++ (как отмечено в комментарии). В зависимости от того, как вы настроили свой скрипт make, это будет удобно

...