2016-09-20 15 views
0

У меня есть куча .a файлов, процесс генерации которых не контролируется мной, а также их источники. Когда я использую их для связи, я хочу знать их зависимости (libA.a зависит от libB.a, если есть некоторый символ не определен в libA.a но определяется в libB.a), так что я могу поставить их в правильном порядке, в командной строке ld/gcc.Учитывая две статические библиотеки Linux, как определить, зависит ли друг от друга?

Я не хочу заниматься связыванием (т. Е. Указать эти библиотеки дважды), потому что я хочу сохранить эти зависимости в файле BUILDbazel, поэтому я хочу знать точную зависимость.

Интересно, если есть какой-то инструмент командной строки, учитывая libA.a и libB.a, можно сказать, зависит ли libA.a на libB.a? Если этого не происходит, как написать такой скрипт?

Примечание: мое определение для зависит от не может быть на 100% точным. Сообщите мне, есть ли другие типы зависимостей, кроме определенных/неопределенных символов.

Самый простой способ обработать вывод nm libA.a и nm libB.a и искать U символов, но есть много типов символов, перечисленных в man nm, каждый из них имеет разные семантические, поэтому я забочусь я мог бы пропустить некоторые, если я используйте такой упрощенный подход.

+0

статические библиотеки не зависят от какого-либо другого Lib в окончательном. –

+0

@IporSircer, они не имеют зависимости, закодированной в формате файла, например '.so', но у них есть зависимости. Если 'libA.a' зависит от' libB.a', то в 'ld' командной строке' libA.a' следует поместить перед 'libB.a', из-за того, как работает' ld'. –

ответ

0

Я бы использовал подход, начинающийся с символов U. На практике все символы - это все, что вам нужно, чтобы беспокоиться (это то, с чем вы ссылаетесь). Я писал сценарии для печати экспортированных и импортированных символов, и для этого случая, было бы достаточно, чтобы сделать

exports libB.a >libB-exports 
externs libA.a >libA-externs 
comm libB-exports libA-externs >libA-needs-libB 

в список символов, где Lība будет использовать символ из libB (списки сортируются, так comm должны " просто работай"). Если это были разделяемые библиотеки, скрипты должны были быть изменены (добавив опцию -D к `nm).

Дальнейшее чтение: