Как создать файл без формата с скомпилированным 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
33 +18
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
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 95 839 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир