GCC, Elf, секции релокации
От: 0x7be СССР  
Дата: 06.06.18 08:42
Оценка:
Коллеги,
у меня такой специфический вопрос.

Согласно документации, gcc при генерации релоцируемого кода создаёт специальные секции, в которые помещает соответствующую информацию о релокации: .rela.code, .rela.data и т.п.
Для создания результирующего образа я написал свой собственный linker script, в котором аккуратно по нужным адресам раскладываю код, данные и прочее.
Есть цель — сделать так, чтобы на целевой системе загрузчик мог динамически релоцировать код. Для этого я решил в результрирующий образ сбросить эти секции.
Для этого вставил в linker script следующий код:
...
.relocations :
{
 *(.rela.*);
}
...


Но по факту выходная секция .relocations имеет нулевую длину, хотя в a.out, который получается из GCC секции с данными релокации присутствуют.

Что я делаю не так?

P.S. Использую сборку gcc: m68k-elf-gcc для архитектуры MC68000, целевая система — собранный на коленке компьютер на базе этого процессора.
Re: GCC, Elf, секции релокации
От: fk0 Россия https://fk0.name
Дата: 12.08.18 12:40
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Согласно документации, gcc при генерации релоцируемого кода создаёт специальные секции, в которые помещает соответствующую информацию о релокации: .rela.code, .rela.data и т.п.

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

Написание самодельных линкер-скриптов дурная затея: придётся учесть все ньюансы компилятора и не дай бог в следующей версии gcc будет не так.
Скорей достаточно с помощью -Wl,script.ld добавить свою часть к скрипту от компилятора, где через INSERT AFTER .section и/или INSERT BEFORE .section делаются нужные вещи.

0>Есть цель — сделать так, чтобы на целевой системе загрузчик мог динамически релоцировать код.


Мы говорим о "обычном" ельфе с релокациями или собранном с ключем -shared? В последнем случае код позиционно-независимый и все релокации делаются через GOT. Осталось только релоцировать саму GOT-таблицу и данные в .data-секции (.text релоцировать не нужно). Это может быть сильно проще, так как все "сложные" релокации в основном в секции .text были. А тебе лишь написать свой "динамический загрузчик" работающий с простыми релокациями (просто прибавить 32-битное число).

0> Для этого я решил в результрирующий образ сбросить эти секции.

0>Для этого вставил в linker script следующий код:
0>
0>...
0>.relocations :
0>{
0> *(.rela.*);
0>}
0>...
0>


0>Но по факту выходная секция .relocations имеет нулевую длину, хотя в a.out, который получается из GCC секции с данными релокации присутствуют.

0>Что я делаю не так?

Есть два типа релокаций, rela и просто rel. Поищи описание на сайте оракла -- там более-менее подробно. У тебя может использоваться просто rel (который задает релокацию относительно адреса записанного прямо в .text, а не пишет адрес и смещение прямо в секции релокации, как делает .rela).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.