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%3Fkailot2 писал(а):
Линкер ругался на объектники собраные 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)