LINUX.ORG.RU

gcc -> бинарный код (без elf заголовка)


0

0

Здраствуйте.
Не подскажите можно ли создать с помощью gcc
бинарный код, код без заголовка elf ?
Если можно то какие флажки, нужно ли разбивать на
2 этапа компиляция + линковка?
Объясните пожалуйста популярно на пальцах, если можно.
anonymous

линковать не нужно точно. gcc -c test.c перодит test.o - объектный код, может это тебе и нужно?

Pi ★★★★★
()
Ответ на: комментарий от tailgunner

Нужно разбить на объектные файлы. Далее:

Линковка(Makefile) выглядит так:
$(PROG): $(OBJS)
        $(LD) $(LDFLAGS) -o $(PROG) $(OBJS)

LDFLAGS выглядит так:
LDFLAGS=--oformat=binary

anonymous
()
Ответ на: комментарий от anonymous

Спасибо.
А можно как то указать адресс загрузки ?

LD :
"--image-base value"   ?
The default is 0x400000 for executables, and  0x10000000 for  dlls.
[This option is specific to the i386 PE targeted port of the linker]

Или это не то ? Это зависит от реализации компанощика ?

Обязательно ли при этом создавать кусок кода на asm ?
у меня выдало:
ld: warning: cannot find entry symbol _start; defaulting to 08048000
в файле был только код:   
int main(void) {  return 0; }

Или в коде нужно зашивать адресс ?
Если не сложно объясните этот момент, не могу ничего найти.

anonymous
()
Ответ на: комментарий от anonymous

скрипт компоновщика

/* script.ld */
ENTRY(main)
OUTPUT_FORMAT("binary")
SECTIONS {
.text BASE : AT(0) {
*(.text)
}
}

компилировать линковать так
gcc -c main.c
ld -T script.ld main.o -o main.bin

rei3er
()
Ответ на: комментарий от anonymous

размер файла при таком способе будет расти пропорционально адресу ;)

rei3er
()

При написании прогамм для avr я делаю так avr-objcopy -j .text -j .data -O ihex main.elf main.hex

Ван навероне надо сделать что то похожее, только выходной фромат должен быть не hex в binary. Т.е что то типа:

objcopy -j .text -j .data -O binary main.elf main.bin

platerx
()
Ответ на: комментарий от generatorglukoff

Спасибо.
Можно и не отвечать, все и так знаете.
Не подскажите, синтаксис 'gas' (at&t) не везде используется ?
Я столкнулся с тем что gcc из пакета binutils для определенной
архитектуры не хочет компилировать код "movl $1, %eax".
А когда подсовываешь ему родной ассемблер он его проглатывает.
Да и в ядре hal-уровень так-же не везде использует at&t.
А нельзя ли все программировать с помощью at&t (gas) ?


anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.