ссылка со статической библиотекой по сравнению с файлами отдельного объекта

По причине я хочу распаковать статический lib (libx.a) в файлы отдельного объекта (a.o b.o c.o) и указать эти объектные файлы (a.o b.o c.o) во входном списке компоновщика вместо libx.a, с другими опциями компоновщика, остающимися тем же.

Однако я заметил, что вышеупомянутое изменение привело к некоторому различию в выходном исполняемом файле. В основном (a.o b.o c.o) метод приведет к большему выходному размеру.

Таким образом, каково различие между этими двумя методами (libx.a и файлы отдельного объекта)? И существует ли способ работать вокруг?

GNU binutil (для и площадь ld) версия, которую я использую, 2.16.1

Спасибо.

10
задан user313031 9 April 2010 в 18:01
поделиться

1 ответ

Ld удаляет неиспользуемые части связанных архивов .lib (например, переменные с глобальной связью). Эта оптимизация не может иметь место, когда объектные файлы передаются напрямую, так как компоновщик не может определить, нужен ли какой-либо элемент файла .o, на который нет ссылки, какой-то неизвестной части позже (например, потому что он будет внешне видимым для списка экспорта модуля) или можно удалить полностью. Когда .lib вставляется в процесс связывания, компоновщик точно знает, что он может отбросить ненужные элементы.

10
ответ дан 4 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: