簡體   English   中英

使用 aarch64-linux-gnu- 在 Linux 中交叉編譯中的鏈接問題

[英]Linking issue in Cross Compilation for arm in linux using aarch64-linux-gnu-

嘗試鏈接 (-aarch64-linux-gnu-ld) 時出現錯誤(包含 Makefile 的腳本是從https://github.com/Icenowy/aw-el2-barebone下載的)。 錯誤是“aarch64-linux-gnu-ld:錯誤:無法消除歧義:-nostartfiles(您是說 --nostartfiles 嗎?) make: *** [Makefile:31: el2-bb.elf] Error 1” 如何重新編碼31號線? Makefile 的

CROSS_COMPILE = /usr/bin/aarch64-linux-gnu-

DEBUG = 1

CC = $(CROSS_COMPILE)gcc
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopy

INCLUDES = -I ./include -I ./uboot-headers -ffreestanding

DEFINES = -DSOC_HEADER="\"h6.h\""

ifneq ($(DEBUG),1)
DEFINES += -DNDEBUG
endif

ASFLAGS = $(INCLUDES) $(DEFINES) -D__ASSEMBLY__
CFLAGS = $(INCLUDES) $(DEFINES) -O2

LDSCRIPT = ldscripts/a64.ld
LDSCRIPTS = ldscripts/a64.ld ldscripts/common.ld

LDFLAGS = -nostdlib -nostartfiles -static -T $(LDSCRIPT)

OBJS = start.o init.o uart.o stack.o exceptions.o exception_funcs.o panic.o pgtables.o  trapped_funcs.o

all: el2-bb.bin

el2-bb.elf: $(OBJS) $(LDSCRIPTS)
    $(LD) $(LDFLAGS) $(OBJS) -o $@

el2-bb.bin: el2-bb.elf
    $(OBJCOPY) -O binary $< $@

.PHONY: clean
clean:
    rm -f el2-bb.* *.o

-nostartfilesgcc選項,但不是ld選項。

如果你使用gcc來調用鏈接器(比如在你的 Makefile 中使用LD=gcc )來制作一個不使用標准啟動文件的獨立程序,你應該使用-nostartfiles因為gcc默認鏈接啟動文件而-nostartfiles禁用它。

ld默認情況下不鏈接任何啟動文件,因此沒有禁用鏈接它們的選項。 您總是將啟動文件顯式傳遞給ld 如果您不想要啟動文件,請不要將它們傳遞給ld

為了查看系統上的啟動文件是什么,請創建一個空的 C 程序:

int main(){}

並編譯它:

gcc -c empty.c
gcc -v empty.o

您可能會看到對ld (或者可能是collect2 ,它調用ld )的調用,其中包含一長串選項和目標文件。

現在運行

gcc -nostartfiles -v empty.o

.o 文件現在消失了。 這正是-nostartfiles所做的。

當您調用ld empty.o時,這些文件和選項一開始就不存在 為了為 Linux 系統制作一個工作程序,您需要將其中的大部分顯式傳遞給ld 如果您正在為其他系統構建程序,您可能不需要其中的部分或全部。 所以不要把它們傳進去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM