Запретить импорт функции из статической библиотеки - PullRequest
9 голосов
/ 26 января 2012

Скажем, у меня есть две статические библиотеки, которые не были созданы мной, и я не контролирую их содержимое.

Библиотека 1 имеет функции:

A()
B()
C()

Библиотека 2 имеет функции:

A()
D()
E()

Оба должны быть связаны с вызывающим приложением, но конфликт имен A() вызывает ошибки.

Есть ли способ сказать "игнорировать A () из библиотеки 1 при компоновке" в linux, используя gcc и ld.

1 Ответ

7 голосов
/ 27 января 2012

Мне известны несколько методов:

  1. Вы можете сделать копию библиотеки, в которой скрыт соответствующий символ, и связать ее с этой копией.Для этого вам не нужен доступ к любому источнику кода библиотеки: objcopy может сделать это с опцией --localize-symbol.Я описываю, как это сделать с .o файлами в этом ответе на аналогичный вопрос, но тот же метод работает так же хорошо с .a библиотеками.

  2. Можно использовать --allow-multiple-definition параметр .(Если вы связываете с помощью команды gcc, а не с помощью ld напрямую, вам нужно указать параметр как -Wl,--allow-multiple-definition.) Это заставит компоновщик перестать заботиться о множественном определении, и простовместо этого используйте первый, с которым он сталкивается - поэтому вы должны быть осторожны, в каком порядке библиотеки отображаются в командной строке.Недостатком является то, что это глобальный вариант, поэтому, если у вас есть другие неожиданные столкновения символов, он может совершенно неправильно поступить вместо того, чтобы рассказать вам об этом.

...