Я хотел бы объединить несколько файлов .o в один .o, а также объединить некоторые разделы.
Если я выполню
ld -r first.o second.o -o result.o
тогда он правильно объединяет объектные файлы, но мне также нужно объединить различные разделы .text. Эта функция объединения разделов доступна по умолчанию для сценария компоновщика в ld, когда вы связываете общий объект, но мне не удалось принудительно использовать собственный сценарий компоновщика при использовании -r. Кажется, я игнорирую любой скрипт, который я пробовал. Я попытался изменить скрипт компоновщика по умолчанию и заменил блок раздела .text этим
.text :
{
*(.text.unlikely .text.*_unlikely)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
} =0x90909090
Как я могу объединить объектные файлы, а также объединить .text разделы с помощью ld?
но не объединяя все .text * разделы объектных файлов, как
.text
,.text._ZN13somenamespace3FooD1Ev
Наличие .text._ZN13somenamespace3FooD1Ev
вероятно означает, что вы компилируете с -ffunction-sections
и действительно, скрипт компоновщика по умолчанию не будет объединять такие разделы: если вы хотите, чтобы они были объединены, вы не должны были использовать -ffunction-sections
на первом месте!
Тем не менее, следующее сработало для меня, чтобы объединить все .text
разделы:
ld -r -o t.o t1.o t2.o --verbose > /tmp/script
Примечание: скрипт компоновщика для ld -r
ссылка разные из обычного линкерного скрипта (который вы, похоже, изменили).
Отредактируйте / tmp / script для удаления не скриптовых частей, а также для изменения:
.text 0 :
{
*(.text .stub)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
}
К этому:
.text 0 :
{
*(.text .stub .text.*)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
}
В заключение,
ld -r -o t.o t1.o t2.o -T /tmp/script
дает мне t.o
со всем .text
разделы объединены.