[英]Downloading gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu from source, failed building libc
[英]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
-nostartfiles
是gcc
選項,但不是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.