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