binutils-ядро - "двоичный" смысл?


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

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

    extern char _binary_initcode_start[], _binary_initcode_size[];

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

Лекция гласит:

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

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

Я задаюсь вопросом о нотации: это дефолт ? мои поиски этого явно не доказали.

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

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

  • _start -> параметр, который меня интересует.

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

У меня нет доказательств этого, хотя.


Вопрос is :

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

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

Спасибо

2 2

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, поэтому указанные выше символы будут определены в ходе этого процесса.

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