Есть вопросы по редактору компоновщиков GNU "ld"? - PullRequest
2 голосов
/ 02 сентября 2010

У меня есть 2 файла obj, собранных с GNU как , они:

  • a.o: моя основная программа
  • b.o: некоторые служебные функции

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

Теперь я хочу связать их вместе с GNU ld . И я хочу, чтобы a.o появился перед b.o в конечном файле. Как я мог контролировать это? Должен ли я сделать пользовательский раздел и написать в сценарии компоновщика, как это:

SECTIONS
{
  . = 0x7c00;
  .text : { *(.text) }
  .my_custom_section : { *(.my_custom_section) }
  .data : { *(.data) }
  .bss  : { *(.bss) }
}

OUTPUT_FORMAT(binary)

Обновление

Что-то не так с этим вопросом? Я написал это неправильно? Если да, пожалуйста, дайте мне знать, ребята. Большое спасибо.

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

Если я так и сделаю:

ld a.o b.o -o final.bin

Содержимое из a.o будет отображаться до b.o.

Если я так и сделаю:

ld b.o a.o -o final.bin

Иначе будет.

Это означает, что будет управляться таким образом?

Ответы [ 2 ]

2 голосов
/ 03 сентября 2010

В соответствии с руководством :

опциями, которые относятся к файлам ... вызывают чтение файла в точке, в которой опция появляется в командной строке,относительно объектных файлов и других опций файла

Таким образом, порядок файлов в двоичном формате - это порядок их появления в командной строке.

Следовательно, это означает, что будет контролироваться, как вы упомянули в своем обновлении.

0 голосов
/ 03 сентября 2010

Порядок операций с ld на самом деле актуален.

Если явно не указано иное, точка входа - это первый байт кода первого файла в списке.

Полученный исполняемый файл всегда содержит содержимое файлов .o в порядке вызова. (с файлами .a это усложняется).

...