Как решить эту ошибку скрипта компоновщика?

Я создал файл сценария компоновщика как memory.ld -

MEMORY
{
 MYMEMORY(rw) : ORIGIN = 0x0041c620 , LENGTH = 30
}

.myvars (NOLOAD) :
{
 *(.myvarloc)

} > MYMEMORY


In my c program :
__attribute__((section(".myvarloc")))
 ***** measurements[30];

Я использую eclipse IDE для linux rtos. Я добавил -T memory.ld в проекте - свойства - компоновщик - библиотеки - разное в eclipse Я создаю это, потому что: Я хочу фиксированный адрес памяти для переменных измерений размера 30, начиная с 0x0041c620.

Мой вопрос: правильно ли это делать? Если я делаю что-то вроде выше: я получаю ошибку, поскольку - входной файл Linker не используется, а ссылка не выполнена.

ПРИМЕЧАНИЕ. Я возвращаю вопрос.

2 ответа

Если ваша программа действительно проста, скорее всего, скрипт компоновщика должен содержать больше, чем вы положили в свою. Как правило, был бы.text (код, обычно только для чтения),.data(r/w, initialized),.bss(r/w, с нулевым заполнением) плюс некоторые другие, в зависимости от того, что производит ваша инструментальная цепочка, и что ваша RTOS 'ожидает время ожидания.

Итог - начинать с нуля, только если вы уже знаете, что делаете, или если ваш проект действительно прост.

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

Вы можете получить сценарий компоновщика по умолчанию, запустив gcc-for-your-platform some-file.c -Wl,-verbose или ld-for-your-platform -verbose.


Это, скорее всего, потому, что Eclipse не ссылается на компоновщик напрямую. Вместо этого он использует gcc (или g++) в качестве оболочки, которая, в свою очередь, вызывает компоновщик со сценарием компоновщика по умолчанию.

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

Если вы не выполняете кросс-компиляцию, а создаете, например, Windows или Linux, то не делайте то, что делаете! Вы действительно не знаете, что виртуальный адрес, который у вас есть в скрипте-компоновщике, действительно будет доступен вам. И вы не можете использовать его для обмена памятью между процессами, поскольку виртуальный адрес в одном процессе может фактически не совпадать с тем же самым виртуальным адресом в другом процессе (даже если оба процесса создаются из одного и того же исполняемого файла). Вместо этого прочитайте об общей памяти или других методах связи между процессами.

licensed under cc by-sa 3.0 with attribution.