OSDev http://osdev.su/ |
|
FASM + GCC = Позиционно-независимый бинарь? http://osdev.su/viewtopic.php?f=6&t=1087 |
Страница 1 из 1 |
Автор: | kailot2 [ 10 май 2015, 08:40 ] |
Заголовок сообщения: | FASM + GCC = Позиционно-независимый бинарь? |
Всем привет! Вопрос собственно в заголовке. Необходимо получить позиционно-независимый бинарь also модуль ядра. Слинковать его надо из следующих компонентов: lwlibc.o - объектник , содержащий коды вызова функций ос. Собирается FASM'ом. starter.o - код принимающий управление от ядра , и вызывающий main main.o - собирается gcc c опцией -fPIC Не могу слинковать это все. Линкую естесно ld. со скриптом. Содержание скрипта Код: OUTPUT_FORMAT("binary") ENTRY(start) SECTIONS { .text : { *(.text) *(.code) *(.rodata*) *(.data) *(.bss) } } Плюется ошибкой - Неопределенный элементъ _GLOBAL_OFFSET_TABLE_. Есть ли вообще способ собрать позиционно-независимый код из ассемблерных и сишных объектников? |
Автор: | Nable [ 10 май 2015, 13:32 ] |
Заголовок сообщения: | Re: FASM + GCC = Позиционно-независимый бинарь? |
1. Эм, а почему модули ядра - бинари без заголовков? 2. Кроме -fPIC есть ещё -fPIE и -shared. Они нужны, скорее всего. 3. Не хватает в списке нужных секций (.got, например). |
Автор: | kailot2 [ 10 май 2015, 17:11 ] |
Заголовок сообщения: | Re: FASM + GCC = Позиционно-независимый бинарь? |
Nable писал(а): 1. Эм, а почему модули ядра - бинари без заголовков? Для простоты. Мне нужны позиционно-независимые бинари. Что-то в этом направлении у меня не складывается , сейчас посматриваю в сторону dll. Найти адекватную инфу о линуксовых динамических библиотеках сложновато почему-то =( Nable писал(а): 2. Кроме -fPIC есть ещё -fPIE и -shared. Они нужны, скорее всего. Про -shared знаю , но мой gcc выдраный с cygwin'а отказывается его кушать =( А что за -fPIE? Nable писал(а): 3. Не хватает в списке нужных секций (.got, например). Ок. Пойду курить... |
Автор: | kailot2 [ 10 май 2015, 17:50 ] |
Заголовок сообщения: | Re: FASM + GCC = Позиционно-независимый бинарь? |
Линкер ругался на объектники собраные Fasm'ом. Туда нужно как то запихать GLOBAL_OFFSET_TABLE. Как с этим проще поступить? |
Автор: | Nable [ 10 май 2015, 18:02 ] |
Заголовок сообщения: | Re: FASM + GCC = Позиционно-независимый бинарь? |
kailot2 писал(а): Найти адекватную инфу о линуксовых динамических библиотеках сложновато почему-то =( Не вижу ничего сложного, если смотреть в общих чертах. Просто там предполагается что есть ELF-загрузчик, который нюансы формата (тут, ессно, сокрыты сложности) знает и правильно делает. Собственно, глянул у себя в линухе - библиотеки там PIC, а модули ядра через relocations сделаны. Т.е. при загрузке модуля просто упоминания адресов поправляются загрузчиком. kailot2 писал(а): А что за -fPIE? Position-independent executable. Ибо кроме собственно инструкций (PIC), есть ещё нюансы с позиционно-независимыми исполняемыми файлами. Но сам этот флаг вряд ли поможет. kailot2 писал(а): но мой gcc выдраный с cygwin'а отказывается его кушать Дык, компилятор (и прочие инструменты) нужно не пытаться обманывать, а дружить с ним. Т.е. собирать кросскомпилятор под правильную платформу (target), в настройках сборки указав правильные параметры для целевой системы. См. http://wiki.osdev.org/Why_do_I_need_a_Cross_Compiler%3F kailot2 писал(а): Линкер ругался на объектники собраные Fasm'ом. Туда нужно как то запихать GLOBAL_OFFSET_TABLE. Как с этим проще поступить? Не надо вызывать ld напрямую. У gcc есть ключ -T, который позволяет указать linker script. Дальше тупо на вход gcc подаются все файлы .o, а на выходе имеем бинарник. Upd: не, не бинарник, а всё-таки elf, но такой который легко потом с помощью objcopy преобразовать в годный бинарник. Фрагмент используемого Makefile: Код: BIN=output
TOOLS_PREFIX=arm-none-eabi- [...] LDFLAGS=-Wl,--entry=Reset_Handler -T путь/к/файлу.ld -o $(BIN).elf CC=$(TOOLS_PREFIX)gcc AS=$(TOOLS_PREFIX)as LD=$(TOOLS_PREFIX)gcc SIZE=$(TOOLS_PREFIX)size OBJCOPY=$(TOOLS_PREFIX)objcopy SRC=main.c OBJ=main.o ещё_чег.o all: cc ldall $(SIZE) -B $(BIN).elf $(OBJCOPY) -Oihex $(BIN).elf $(BIN).hex $(OBJCOPY) -Obinary $(BIN).elf $(BIN).bin cc: $(SRC) $(CC) $(CFLAGS) -c $(SRC) ldall: $(LD) $(CFLAGS) $(LDFLAGS) $(OBJ) |
Автор: | kailot2 [ 10 май 2015, 18:15 ] |
Заголовок сообщения: | Re: FASM + GCC = Позиционно-независимый бинарь? |
Nable писал(а): Не надо вызывать ld напрямую У меня ld вызывается со скриптом , смотрите тему. Make вызывает ld точно так же как это делаю я. Код: ld.exe -T script.ld -o main.bin main.o По поводу бинарей - мой ld свободно линкует бинари. Кстати в такой форме как записано выше все нормально линкуется, но стоит добавить Код: ld.exe -T script.ld -o main.bin main.o lwlibc.o как линкер начинает ругаться на undefined reference _GLOBAL_OFFSET_TABLE_. Собственно. UDP Код lwlibc на асме. добавил туда Код: public _GLOBAL_OFFSET_TABLE_ ... _GLOBAL_OFFSET_TABLE_: Теперь линкуется нормально , но в таблице смещений явно должна быть какая-нибудь информация? |
Автор: | Nable [ 10 май 2015, 18:37 ] |
Заголовок сообщения: | Re: FASM + GCC = Позиционно-независимый бинарь? |
Нет, самому эту таблицу объявлять не надо. Вот чтиво для NASM: http://www.nasm.us/doc/nasmdoc9.html#section-9.2 А чуть позже и для FASM нашёл: http://board.flatassembler.net/topic.php?t=4964 |
Автор: | kailot2 [ 10 май 2015, 18:47 ] |
Заголовок сообщения: | Re: FASM + GCC = Позиционно-независимый бинарь? |
Nable писал(а): Нет, самому эту таблицу объявлять не надо. Вот чтиво для NASM: http://www.nasm.us/doc/nasmdoc9.html#section-9.2 Да, я знаю что NASM сам строит таблицу GOT. Пошел раскуривать чтиво по FASM. Я кстати тоже нашел его ) |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |