Изменить видимость символа в скомпилированной общей библиотеке - PullRequest
1 голос
/ 12 марта 2019

Мой проект зависит от сторонней библиотеки, которая экспортирует больше символов, чем нужно.Некоторые из этих символов преднамеренно перезаписываются другими библиотеками и основной программой.

Как изменить видимость функций и переменных скомпилированного общего объекта?

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Как изменить видимость функций и переменных скомпилированного общего объекта?

Вы можете изменить видимость символов, изменив раздел динамических символов (.dynsym) -он содержит плоский массив Elf32_Sym с или Elf64_Sym с, и вы можете перезаписать в нем поля .st_info и .st_other (см. этот ответ ).

IЯ не знаю каких-либо инструментов, которые могли бы сделать это проще, вам, вероятно, придется написать специальную программу для этого.

0 голосов
/ 12 марта 2019

Если вы можете загружать проблемную библиотеку динамически через dlopen, вы можете использовать флаг RTLD_DEEPBIND, чтобы заставить ее предпочитать локальные символы значкам в главном исполняемом файле или других шлибах.

Если вы не 'Если вы не хотите управлять вызовами dlopen и dlsym вручную, вы можете создать простой файл-обертку, который будет содержать батуты для необходимых функций.Каждый батут будет внутренне dlopen библиотекой, если она не была загружена ранее, и перенаправит вызов на символ dlsym с тем же именем.Такой файл обертки может быть сгенерирован автоматически с помощью Implib.so tool .

...