2015-03-13 9 views
2

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

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

extern char _binary_initcode_start[], _binary_initcode_size[]; 

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

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

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

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

Интересно, что обозначение: оно по умолчанию? мои поиски не подтвердили этого.

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

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

  • _start. -> параметр я заинтересован в

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

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


Вопрос заключается в:

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

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

Благодаря

ответ

0

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

+0

Waw .. Еще раз спасибо Jester. Ты * очень * знающий! amazing :) – Kroma

1

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

+0

Полезно знать спасибо! +1 – Kroma