ссылка со статической библиотекой против отдельных объектных файлов - PullRequest
10 голосов
/ 09 апреля 2010

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

Тем не менее, я заметил, что указанное изменение привело к некоторой разнице в выходном исполняемом файле. По сути, метод (a.o b.o c.o) приведет к увеличению выходного размера.

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

Используемая мной версия GNU binutil (for и ar ld): 2.16.1

Спасибо.

1 Ответ

10 голосов
/ 10 апреля 2010

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

...