binutils - ядро ​​- значение _binary?

Я читаю xv6 лекции. У меня есть файл с именем initcode.S, который нужно слинковать в ядре.

Таким образом создаются два символа:

    extern char _binary_initcode_start[], _binary_initcode_size[];

внутри функции.

В лекции говорится:

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

Я понимаю, что binutils получает адрес и размер этого собранного кода.

Меня интересует обозначение: это по умолчанию? мои поиски не доказали это ясно.

  • _binary -> это изначально ассемблерный код

  • _initcode -> имя моего файла

  • _start -> интересующий меня параметр.

Это означало бы, что любой скомпилированный ассемблерный код также будет иметь эти переменные.

Однако у меня нет никаких доказательств этого.


Вопрос в следующем:

является ли _binary_myAsmFileHere_myParameterhere переменной структурой по умолчанию, которую binutils дает файлу сборки для экспорта их адреса, размера и т. д.?

Может ли кто-нибудь сказать мне, верно ли мое предположение и лучше ли оно: правило

Спасибо


person Kroma    schedule 13.03.2015    source источник


Ответы (2)


Как ни странно, это не задокументировано в ld руководстве. Однако man objcopy говорит следующее:

Вы можете получить доступ к этим двоичным данным внутри программы, обратившись к специальным символам, созданным в процессе преобразования. Эти символы называются _binary_objfile_start, _binary_objfile_end и _binary_objfile_size. например вы можете преобразовать файл изображения в объектный файл, а затем получить к нему доступ в своем коде, используя эти символы.

По-видимому, та же логика используется ld при встраивании бинарных файлов. Обратите внимание, что Makefile для xv6 содержит эту строку для связывания ядра:

$(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS) -b binary initcode entryother

Как вы можете видеть, он использует -b binary для встраивания файлов initcode и entryother, поэтому указанные выше символы будут определены во время этого процесса.

person Jester    schedule 13.03.2015
comment
Вау.. Еще раз спасибо, Шут. Вы очень осведомлены! удивительно :) - person Kroma; 13.03.2015

когда переменная .global определена в файле сборки, чтобы файл C мог ссылаться на эту переменную, файл C должен добавлять '_' к имени переменной. Это делается для того, чтобы компоновщик мог «связать» имя в файле C с именем в файле сборки.

person user3629249    schedule 13.03.2015