Перемещение символа в начало файла ELF

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

Это достигается созданием файла version.c и превращением результирующего объектного файла в 1-й связываемый объект в команде link.

Однако для одного исполняемого файла это не сработало, и единственное отличие, которое мы можем найти, состоит в том, что исполняемый файл содержит смесь кода на C и C ++, а символ версии перемещается куда-то еще.

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

6

Решение

Вы можете контролировать вывод компоновщика через скрипты. В вашем случае вы можете проверить: https://sourceware.org/binutils/docs/ld/SECTIONS.html#SECTIONS для возможного решения.

Например:

SECTIONS {
.version 0x2020 : { version.o }
.text : { *(.text) }
.data : { *(.data) }
.bss :  { *(.bss)  *(COMMON) }
}

Это не контролирует, где именно разделы будут отображаться в связанном исполняемом файле, но может влиять на него (это, безусловно, влияет при работе с образами ПЗУ), вам придется экспериментировать самостоятельно.

1

Другие решения

В верхней части файла ELF должна быть магическая подпись 0x7f, ‘E’, ‘L’, ‘F’ в соответствии с ELF спецификация.
Вместо того, чтобы поместить версию кода в верхнюю часть исполняемого файла, я полагаю, вы можете использовать некоторые незначительные поля из заголовка Elf, например ei_pad

struct E_Ident {
unsigned long ei_magic;
unsigned char ei_class;
unsigned char ei_data;
unsigned char ei_version;
unsigned char ei_pad[9];
};
0

По вопросам рекламы [email protected]