繁体   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