Подскажите по созданию сырых бинарей с помощью g++

Тема в разделе "LANGS.C", создана пользователем Rel, 8 дек 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    есть такой совершенно простой код:
    Код (Text):
    1. extern "C" int start() { return 0; }
    хочу из него собрать сырой бинарь 32-битный (raw binary, то есть просто код, без всяких заголовков pe/elf формата), использую для этого ключи компиляции:
    Код (Text):
    1. -Os -O3 -Wall -std=c++0x -nostdinc -fno-exceptions -fno-rtti -masm=intel -flto -fconstexpr-depth=1024 -m32 -mno-stack-arg-probe
    и ключи линкера (пускаю линкер через g++):
    Код (Text):
    1. -s -nostdlib -O3 -Os -flto -Wl,--oformat,binary -O2 -m32
    ожидаю при этом получить сырой бинарь, а получаю:
    Код (Text):
    1. ld.exe: cannot perform PE operations on non PE output file '<имя_выходного_файла>'
    подскажите пожалуйста, где я ошибся?

    ЗЫ пробовал сделать через скрипт линкера, но возникает та же ошибка...
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    видимо ld не хочет сырые бинарники собирать на винде...
    пытаюсь сделать через objcopy в постбилд ивенте:
    Код (Text):
    1. objcopy ./Output/Test32.exe -O ./Output/Test32.bin
    но вылезает:
    Код (Text):
    1. objcopy:./Output/sta03172: Invalid bfd target
    это видимо GNU BDF (Binary File Descriptor library) не понимает пути к файлам? как пофиксить?)
     
  3. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    Если на винде почему не visualstudio:

    Код (Text):
    1. vcvarsall.bat
    2. cl anycode.cpp /c /nologo /GS- /GR- /TP /Gm /Zi
    3. link anycode.obj /ENTRY:main /RELEASE /OUT:"anycode.bin" /SUBSYSTEM:NATIVE /NODEFAULTLIB /MACHINE:X86 /BASE:0x0 /MERGE:.text=.data /MERGE:.rdata=.data /SECTION:.text,EWR
    4. objcopy anycode.bin -I pe-i386 -O binary
    objcopy из GNU. должно быть в PATH и vcvarsall.bat тоже.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    о... по многим причинам...
     
  5. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Rel
    Ulink, вроде как такое умеет - для 16 бит точно.
    Путь в кавычки "/folder1/folder2/somefile.ext" - иногда помогает ))))
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Rel
    Psionic
    Дело не в кавычках. Попробуй рецепт отсюда http://www.rsdn.ru/forum/cpp.applied/1594273.flat.aspx