[英]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.