Я пытаюсь скомпилировать встроенный процессор с использованием gcc-arm-linux-gnueabi
и -nostdlib
для удаления зависимостей от библиотек c и файлов автозагрузки. Чип не имеет никакого способа интерпретировать файлы эльфа, поэтому, используя objcopy -O binary
, я могу удалить его из него. Однако, если я оставлю идентификатор сборки, тогда двоичный файл имеет идентификатор сборки в начале вывода, и поэтому он не запускается. Я могу удалить идентификатор сборки в компоновщике script с помощью /DISCARD/ : { *(.note.gnu.build-id) *(.ARM.attributes) }
, однако тогда компоновщик предупреждает о .note.gnu.build-id section discarded, --build-id ignored.
. Хотя это работает отлично, и код работает на чипе, я бы не пропускал, а затем отбрасывал идентификатор сборки. Есть ли способ проинструктировать gcc
передать команды компоновщику без передачи --build-id
?
Не передавать --build-id в компоновщик из gcc
Ответ 1
Я думаю, что эти параметры будут делать то, что вы хотите:
-Wl,--build-id=none
Передача none для стиля отключает параметр из любых параметров -build-id ранее в командной строке.
Ответ 2
Это старая запись, но для потомков стоит сказать, что вам не нужно сбрасывать идентификатор сборки. Ваш альтернативный вариант - переместить его в другую область, отредактировав скрипт компоновщика.
Просто переместите идентификатор сборки куда-нибудь после таблицы векторов в текстовом разделе:
.text :
{
. = ALIGN(4);
_stext = .;
KEEP(*(.vectors .vectors.*))
KEEP(*(.note.gnu.build-id))
*(.text .text.*)
*(.rodata .rodata*)
. = ALIGN(4);
_etext = .;
} > rom
Это сохранит вашу векторную таблицу по адресу 0x0 (вероятно, это требуется вашему MCU), но также позволит вам прочитать идентификатор сборки из кода, который может пригодиться!