Как создать файл без формата с скомпилированным 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};)

8 Янв в 19:54
103 +2
0
Ответы
1

Создание скомпилированного C-кода в формате "без формата" с заданными параметрами требует выполнения нескольких шагов. Вот общая последовательность действий, которую вы можете выполнить на macOS, чтобы получить требуемый файл:

Компиляция C-кода: Начнем с компиляции вашего C-файла в объектный файл. Используйте флаг -ffreestanding, чтобы сообщить компилятору, что вы не используете стандартную библиотеку и ваше окружение не стандартное.

Сборка объектного файла: Скомпилированный объектный файл необходимо слинковать так, чтобы он начинался с заданного адреса.

Преобразование в бинарный файл: Наконец, необходимо преобразовать слинкованный файл в бинарный файл без формата.

Попробуйте следующий последовательный подход.

Пример процессаСоздание C-файла: Допустим, ваш файл называется kernel.c.// kernel.c
void func() { /* Здесь ваш код */ }
void* pointers[16] = {(void*)&func};Компиляция в объектный файл:gcc -ffreestanding -m32 -c kernel.c -o kernel.oСоздание скрипта линковки: Создайте файл linker_script.ld со следующим содержимым для задания начального адреса и других параметров:SECTIONS
{
. = 0x100200;
.text : {
*(.text)
}
}Линковка: Линкуйте объектный файл, используя ваш скрипт линковки:x86_64-elf-ld -m elf_i386 -T linker_script.ld -o kernel.bin kernel.oПреобразование в бинарный файл: С помощью objcopy создайте бинарный файл:objcopy -O binary kernel.bin kernel_final.bin

Теперь у вас должен быть скомпилированный бинарный файл kernel_final.bin, который содержит ваш скомпилированный 32-битный код без формата и смещенный на 0x100200.

Советы дополнительноУбедитесь, что gcc, x86_64-elf-ld и objcopy установлены и доступны в вашей системе. Для этого вы можете установить пакет gcc-arm-none-eabi или соответствующий пакет для вашего дистрибутива.Если вы используете свой код, убедитесь, что он соответствует требованиям компиляции без стандартной библиотеки (например, избегайте использования вспомогательных функций из стандартной библиотеки C).
8 Янв в 19:54
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир