объединить два скомпилированных 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.