Задать вопрос
@nnGot583
c#, iOS дизассемблирование

Как создать файл без формата с скомпилированным C кодом?

здравствуйте, мне нужно создать файл содержащий скомпилированный код на C 32-битный без формата, без pie, смещенный на 0x100200. (использую macos)
Я пробовал это сделать так

gcc -ffreestanding -m32 -no-pie -fasm-blocks -o kernel.bin -c kernel.c

objconv -felf kernel.o kernel_elf.o

x86_64-elf-ld -m elf_i386 -Ttext 0x100200 -e _CHANDLER -o cckernel -static kernel_elf.o

/usr/local/opt/binutils/bin/objcopy -O binary cckernel rckernel

(пытался добавить fasm blocks окольными путями, поэтому так много команд. Своей попыткой недоволен из-за неверных абсолютных адресов в массивах
по типу
, 
void func()
{
      
}
void* pointers[16] = {(void*)&func};
)

  • Вопрос задан
  • 566 просмотров
Подписаться 3 Простой 6 комментариев
Решения вопроса 1
@nnGot583 Автор вопроса
c#, iOS дизассемблирование
Думаю вопрос решен, основная проблема отсутствие поддержки таких бесформатных файлов ld для macos. Пришлось 7 часов устанавливать llvm ради компоновщика от туда.
1) brew install lld
2) установите кроссплатформенный gcc (называется полностью "x86_64-elf-gcc")

мой код для проверки работы утилит:
int kap1 = 0x45454545;
void func()
{

}
void* kap2 = (void*)&func;


3) компилируем это в объектный ELF файл (macho не поддерживается)

x86_64-elf-gcc -m32 -ffreestanding -c test.c -o test.o

4) линкуем файл сам с собой

ld.lld -o pop --image-base 0x100200 --oformat binary test.o

5) команда "file pop" выведет data значит формата нет

6) открываем дизассемблер и смотрим что там, нас интересует адрес в переменной kap2 он должен быть равен, вероятно, 0х100200

677eeb9b0627d403737265.png

сначала функция потом байты kap1 и kap2 в котором корректный адрес - значит все работает а про fasm blocks можно забыть
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
Возможно, вам поможет кусок из моей статьи, к которому я сам часто возвращаюсь. Правда, там ARM, но gcc везде +/- одинаковый

arm-none-eabi-gcc.exe echo.c -nostdlib -O2 -o echo.out
arm-none-eabi-objcopy.exe -O binary echo.out echo.bin


По-хорошему нужно явно указать компилятору, по какому адресу будет расположен код директивой -Wl,--section-start=.text=0x30400000 (последнее - требуемый адрес)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы