2016-11-04 3 views
1

У меня есть сборка для RISCV, которая определяет раздел .text, начиная с .globl _start.Где есть символ _start, который может быть определен

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

Я угадываю, что это появляется в файле где-то как функция архитектуры, но может ли кто-нибудь сказать мне, где? (Это все строится с использованием RISCV GNU кросс-компиляторов на Linux)

+0

Ответ на этот вопрос включает внутренние детали компоновщика, загрузчика и кода запуска. Или, говоря иначе, адрес '_start' будет назначен во время выполнения, поэтому определение' grep' не будет найдено. – user3386109

+0

Для моих проектов без покрытия я сопоставляю '_start' с фиксированным адресом в скрипте компоновщика. В противном случае я не могу гарантировать, что '_start' находится в нужном месте. – fsasm

+1

Должна быть строка '_start:', которая определяет метку '_start' в том же файле исходного кода, что и директива' .globl_start', иначе директива '.globl_start' не делает ничего полезного. –

ответ

1

Если вы не контролируете его самостоятельно, как правило, по крайней мере в мире инструментов gnu файл crt0.s. Или, возможно, другое имя. Должна быть одна для архитектуры, поскольку она находится на языке ассемблера. Это загрузочный файл по умолчанию, нули .bss копирует .data по мере необходимости и т. Д.

Я не помню, является ли это частью библиотеки C (glibc, newlib и т. Д.), Или если она добавлена ​​позже людьми, которые создайте инструментальную цепочку, ориентированную на определенную платформу.

Не обязательно, конечно, но не редкость видеть, что _start - это метка начала двоичного файла, она должна быть точкой входа, конечно. Поэтому, если у вас есть операционная система/загрузчик, в которой используется двоичный код с метками (эльф и т. Д.), Тогда он может загружать двоичный файл и вместо ветвления на первый адрес, который он отдает в точку входа.

+0

действительно. Infact Я написал свой собственный crt.S для этого (взломав кусочки других людей). Теперь я понимаю, что _start просто определяется как загружается этот код ввода. – adrianmcmenamin

0

Так _start это просто определяется как в начале раздела .text, а также адрес секции .text определяется в скрипте линкера.