Сборка incbin-файла и использование в C-файле + GCC 5.4.0 - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть файл сборки.Я буду использовать этот файл для включения двоичного файла, как показано ниже:

.section .bindata

.global imrdls_start
.type imrdls_start, @object

.global imr_SW_DL_start
.type imr_SW_DL_start, @object

.section .bindata
.balign 64
imrdls_start:
imr_SW_DL_start:
    .incbin "file.bin"
    .balign 1
imr_SW_DL_end:
    .byte 0

Затем в файле C я буду вызывать эту переменную и использовать содержимое этого двоичного файла.

int main(void) {
    extern uint8_t imrdls_start;
    uint8_t *ptrToExpectedDL = &imrdls_start;

    for(int i = 0; i < 135; i++)
    {
        printf("0x%02x ", ptrToExpectedDL[i]);
        if((((i + 1) % 15) == 0)) printf("\n");
    }

    return EXIT_SUCCESS;
}

Дело в том, что после компиляции и выполнения содержимое распечатки «file.bin» неверно.

Ожидаемый результат: 00 1d 81 ff 00 fe 00 ff 00 1e 82 00 00 20 82...

Выходные данные для мусорной корзины: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 ...

Ниже приведен мой вариант компилятора и связи:

qcc -Vgcc_ntoaarch64le -c -Wp,-MMD,build/aarch64le-debug/src/imrdls.d,-MT,build/aarch64le-debug/src/imrdls.o -o build/aarch64le-debug/src/imrdls.o  -Wall -fmessage-length=0 -g -O0 -fno-builtin  src/imrdls.s
qcc -Vgcc_ntoaarch64le -c -Wp,-MMD,build/aarch64le-debug/src/Test.d,-MT,build/aarch64le-debug/src/Test.o -o build/aarch64le-debug/src/Test.o  -Wall -fmessage-length=0 -g -O0 -fno-builtin  src/Test.c
qcc -Vgcc_ntoaarch64le -o build/aarch64le-debug/Test   build/aarch64le-debug/src/Test.o build/aarch64le-debug/src/imrdls.o  

Любые комментарии будут действительно полезны.Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

если вы посмотрите на вывод «7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00», вы увидите, что он совпадает с заголовком эльфа. ссылка

Когда создается новый раздел с использованием директивы .section, необходимо указать атрибуты и тип этого раздела.замена первой строки в файле сборки на это должна работать:

.section .bindata , "a", @progbits

a помечает раздел как выделяемый.("aw" также сделает его доступным для записи, но вам не нужно это для констант. Вы будете использовать "aw" для эквивалента .data, а не .rodata.)

Если нет флаговфлаги по умолчанию зависят от имени раздела.Если имя раздела не распознано, по умолчанию для раздела не будет установлен ни один из флагов: он не будет размещен ни в памяти, ни в режиме записи, ни в исполняемом файле.Раздел будет содержать данные. Ссылка

0 голосов
/ 14 декабря 2018

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

Если вам действительно не нужно контролироватьрасположение включенных данных относительно сгенерированных компилятором данных только для чтения, просто поместите ваши данные в .section .rodata.

(я удивлен, что компоновщик не жаловался, и что вы не получилиsegfault во время выполнения. Я бы надеялся, по крайней мере, на segfault вместо того, чтобы молча получать фиктивные данные.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...