Не передавать --build-id в компоновщик из gcc

Я пытаюсь скомпилировать встроенный процессор с использованием 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?

Ответ 1

Я думаю, что эти параметры будут делать то, что вы хотите:

-Wl,--build-id=none

Передача none для стиля отключает параметр из любых параметров -build-id ранее в командной строке.

- ld manual

Ответ 2

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

Просто переместите идентификатор сборки куда-нибудь после таблицы векторов в текстовом разделе:

    .text :
    {
        . = ALIGN(4);
        _stext = .;
        KEEP(*(.vectors .vectors.*))
        KEEP(*(.note.gnu.build-id))
        *(.text .text.*)
        *(.rodata .rodata*)
        . = ALIGN(4);
        _etext = .;
    } > rom

Это сохранит вашу векторную таблицу по адресу 0x0 (вероятно, это требуется вашему MCU), но также позволит вам прочитать идентификатор сборки из кода, который может пригодиться!