OSDev

для всех
Текущее время: 29 апр 2024, 19:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 10 май 2015, 08:40 

Зарегистрирован: 09 янв 2015, 04:04
Сообщения: 35
Всем привет! Вопрос собственно в заголовке. Необходимо получить позиционно-независимый бинарь 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_.
Есть ли вообще способ собрать позиционно-независимый код из ассемблерных и сишных объектников?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 май 2015, 13:32 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
1. Эм, а почему модули ядра - бинари без заголовков?
2. Кроме -fPIC есть ещё -fPIE и -shared. Они нужны, скорее всего.
3. Не хватает в списке нужных секций (.got, например).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 май 2015, 17:11 

Зарегистрирован: 09 янв 2015, 04:04
Сообщения: 35
Nable писал(а):
1. Эм, а почему модули ядра - бинари без заголовков?

Для простоты. Мне нужны позиционно-независимые бинари. Что-то в этом направлении у меня не
складывается , сейчас посматриваю в сторону dll. Найти адекватную инфу о линуксовых
динамических библиотеках сложновато почему-то =(
Nable писал(а):
2. Кроме -fPIC есть ещё -fPIE и -shared. Они нужны, скорее всего.

Про -shared знаю , но мой gcc выдраный с cygwin'а отказывается его кушать =(
А что за -fPIE?
Nable писал(а):
3. Не хватает в списке нужных секций (.got, например).

Ок. Пойду курить...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 май 2015, 17:50 

Зарегистрирован: 09 янв 2015, 04:04
Сообщения: 35
Линкер ругался на объектники собраные Fasm'ом. Туда нужно как то запихать GLOBAL_OFFSET_TABLE. Как с этим проще поступить?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 май 2015, 18:02 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
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)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 май 2015, 18:15 

Зарегистрирован: 09 янв 2015, 04:04
Сообщения: 35
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_:

Теперь линкуется нормально , но в таблице смещений явно должна быть какая-нибудь информация?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 май 2015, 18:37 

Зарегистрирован: 26 мар 2012, 17:32
Сообщения: 209
Нет, самому эту таблицу объявлять не надо.

Вот чтиво для NASM: http://www.nasm.us/doc/nasmdoc9.html#section-9.2
А чуть позже и для FASM нашёл: http://board.flatassembler.net/topic.php?t=4964


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 май 2015, 18:47 

Зарегистрирован: 09 янв 2015, 04:04
Сообщения: 35
Nable писал(а):
Нет, самому эту таблицу объявлять не надо.

Вот чтиво для NASM: http://www.nasm.us/doc/nasmdoc9.html#section-9.2

Да, я знаю что NASM сам строит таблицу GOT.
Пошел раскуривать чтиво по FASM. Я кстати тоже нашел его )


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB