Objcopy, как он делает бинарный вывод?

Поскольку я новичок в binutils, gcc и других, у меня есть несколько общих вопросов, ответы на которые я не нашел в руководствах.

Я использую C и сборку (синтаксис nasm), и мне нужны необработанные двоичные файлы на выходе. Прежде всего, я компилирую свой код в объектный файл с параметрами:

cc -nostartfiles -nostdlib -c -ffreestanding <input file(s)> ;cc or gcc no matter

Затем я связываю все файлы с помощью простого скрипта, который только ставит сегменты в нужном порядке.

ld -T <script> -o <o.file> <in.file(s)>  ;nothing special here

И чтобы получить необработанный двоичный файл, я использую objcopy

objcopy -O binary <o.file> <in.file> ;can't be simplier

В общем, мне нужен бинарный файл только с сегментами .text и .data в нем и 32-битным кодом.

1.Могу ли я таким образом получить то, что хочу?

2.Есть ли другие способы сделать это? (неважно проще или сложнее)


Спасибо за помощь.


У меня нет проблем с компиляцией Asm-кода, почти все проблемы с C-кодом.


person hrust    schedule 23.07.2012    source источник


Ответы (2)


Однажды я наткнулся на страницу руководства ld, и было сказано, что блок /DISCARD/ исключает все перечисленное в нем из окончательного вывода.

Поэтому я вставил этот блок после блоков .text, .data и .bss.

/DISCARD/ : 
{
    *(.comment)
    *(.eh_frame)
    *(.note.GNU-stack)
}

Как и эта строчка в самом начале моего скрипта компоновщика.

OUTPUT_FORMAT("binary")

Поэтому мне больше не нужно использовать objcopy.

person hrust    schedule 19.10.2015

Вам нужно скомпилировать исходные файлы с помощью этой команды

nasm -o bin <SOURCE FILES>

Это будет производить чистый двоичный вывод.

person Alex Elzenaar    schedule 23.07.2012
comment
nasm - это обычный ассемблер, который ничего не может сделать с исходными файлами C в проекте... - person Géza Török; 11.09.2018