Как я могу поместить некоторый раздел памяти в конкретную память - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь понять скрипт связи G CC и создать небольшую демонстрацию для практики, однако я получил «синтаксическую ошибку» от ld. Я ценю любые комментарии или предложения. Большое спасибо!

привет. c

__attribute__((section(".testsection"))) volatile int testVariable;

hello.ld

MEMORY {
  TEST_SECTION: ORIGIN = 0x43840000 , LENGTH = 0x50    
}
SECTIONS{
.testsection: > TEST_SECTION /* Syntax error here*/
}

команда компиляции

gcc -T hello.ld -o hello hello.o
c:/gnu/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe:../hello.ld:20: syntax error
collect2.exe: error: ld returned 1 exit status

1 Ответ

0 голосов
/ 18 марта 2020

оригинальное сообщение

MEMORY {
  TEST_SECTION: ORIGIN = 0x43840000 LENGTH = 0x50    
}
SECTIONS{
.testsection: > TEST_SECTION
}

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

решение

MEMORY {
  TEST_SECTION: ORIGIN = 0x43840000, LENGTH = 0x50    
}
SECTIONS{
.testsection: { *(.testsection*) } > TEST_SECTION
}

Я думаю, что это было отсутствуют две вещи

Во-первых, запятая между значением источника и длиной.

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

.testsection: { } > TEST_SECTION

, но я думаю, не пытаясь это сделать, вы ничего не получите в этой памяти.

РЕДАКТИРОВАТЬ

после проведения эксперимента:

so.s

.text
add r0,r0,r0
add r1,r2,r3
add r1,r1,r1
add r2,r2,r2

so.ld

MEMORY
{
    bob : ORIGIN = 0x30000000, LENGTH = 0x1000
    ted : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .hello : { *(.text*) } > bob
    .world : { } > ted
    .text : { } > ted
}

Disassembly of section .hello:

30000000 <.hello>:
30000000:   e0800000    add r0, r0, r0
30000004:   e0821003    add r1, r2, r3
30000008:   e0811001    add r1, r1, r1
3000000c:   e0822002    add r2, r2, r2

как я и подозревал, сначала я уже ввел новые имена в MEMORY, как вы хотите, как вы видели RAM, ROM и т. Д. c не являются специальными именами, просто не могут использовать зарезервированные имена, если таковые имеются. Я подозревал, что РАЗДЕЛЫ работают так же, как слева - новое имя, которое вы создаете для вывода. Это встроенное и связанное просто отлично (не настоящая программа, очевидно, достаточная для того, чтобы получить инструменты для демонстрации).

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

Я настоятельно рекомендую проводить подобные эксперименты и использовать такие инструменты, как readelf и objdump и другие, чтобы изучить, что происходит. (а также чтение документации по языку сценариев).

...