объединить два скомпилированных GCC объектных файла .o в третий .o файл

84

Как объединить два объектных файла .o, скомпилированных GCC, в третий файл .o?

Если у вас есть доступ к исходным файлам, -combineфлаг GCC объединит исходные файлы перед компиляцией:

Однако это работает только для исходных файлов, и GCC не принимает .oфайлы в качестве входных данных для этой команды.

Обычно связывание .oфайлов не работает должным образом, поскольку вы не можете использовать выходные данные компоновщика в качестве входных для него. В результате получается общая библиотека, которая не связана статически с исполняемым файлом.

Лучиан Адриан Гриджинку
источник
1
gcc в настоящее время не имеет такой -combineвозможности. Он существует в gcc 4.1.2 и не существует в gcc 6.3.0 (кто-то другой может выяснить, когда он был удален).
Кейт Томпсон

Ответы:

98

Передача -relocatableили -rв ldсоздаст объект, который подходит в качестве входных данных ld.

Созданный файл имеет тот же тип, что и исходные .oфайлы.

Лучиан Адриан Гриджинку
источник
2
Можно ли сделать обратную операцию? т.е. производить ао и бо из со?
Берт Регелинк
7
@BertRegelink нет, потому что нет уникального обратного, С точки зрения математики, не образует группу: P
Алек Тил
7
Предупреждение: --relocatableкажется менее портативным. Ld, поставляемый с Android NDK, распознает только файлы -relocatable. Если вам нужна портативность, придерживайтесь -r.
Мартин Боннер поддерживает Монику
3
@matthijs Слово то же самое; разница один-два.
Мартин Боннер поддерживает Монику
1
Ах, не видел этого. Итак, Android NDK распознает только -relocatable and -r , но не распознает --relocatable. Спасибо за разъяснения!
Matthijs Kooijman
10

Если вы хотите создать архив из двух или более файлов .o (т.е. статическую библиотеку), используйте arкоманду:


источник
@Lucian Но зачем тебе это делать? Связывание со статической библиотекой намного удобнее, чем с файлом .o.
5
Мне нужно запустить objcopyполучившийся файл и сделать некоторые символы локальными для файла, чтобы они не были видны извне. Некоторые из символов , которые нужно локализовать ссылаются между a.oи b.oфайлами. Я не могу локализовать отдельные файлы - символы не будут найдены во время компоновщика - и я также не могу локализовать символы из статического архива.
Lucian Adrian Grijincu