GCC создает плоский двоичный файл с правильно связанным разделом данных

Я пытаюсь создать плоский двоичный файл с gcc, используя objcopy. Мой код C выглядит так:

char* str = "Hello world!";
printString(str,12);

Когда я создаю свой двоичный файл с

C:\MinGW\bin\gcc -c cfile.c -o cfile.o
C:\MinGW\bin\gcc -nodefaultlibs -nostdlib -o comfile.o afile.o cfile.o
C:\MinGW\bin\objcopy -O binary comfile.o kernel.bin

Раздел кода (.text) связан правильно, но раздел данных (.rdata) просто помещен за моим разделом кода и не связан с моим разделом кода. Если я получу доступ к чему-либо в разделе данных, он загрузит что-то из 0x0x401000, а не из правильного места, и произойдет сбой.

Есть ли способ решить эту проблему?

PS: Рабочий код C:

char* str = "Hello world!"-0x401000;
printString(str,12);

person kaetzacoatl    schedule 21.11.2014    source источник
comment
Что означает плоский двоичный код?   -  person unwind    schedule 21.11.2014
comment
@unwind файл, который я могу напрямую загрузить в память и выполнить без связывания или каких-либо других изменений.   -  person kaetzacoatl    schedule 21.11.2014
comment
Написать скрипт компоновщика, где вы указываете базовый адрес и размер для каждой секции?   -  person Michael    schedule 21.11.2014
comment
@Майкл Как я могу это сделать? Я никогда не работал со скриптами компоновщика.   -  person kaetzacoatl    schedule 21.11.2014
comment
эта ссылка: sourceware.org/binutils/docs-2.10/ld_3.html расскажет вам все, что вы хотите знать (и многое другое) о правилах написания скриптов компоновщика.   -  person user3629249    schedule 21.11.2014
comment
Как насчет этого ответа? ld: невозможно выполнить операции PE при ошибке выходного файла, отличного от PE   -  person hiropon    schedule 26.12.2016