5

我正在尝试使用STARTUPLD 脚本中的指令将程序与我自己的启动文件链接:

...
ENTRY(_start)
STARTUP(my_crt1.o)
...

GCC 驱动程序用于链接程序(不打扰 libgcc 等库路径):

gcc -T my_script.ld ...

不幸的是,它只适用于为 powerpc 目标编译的 GCC,而 arm 或 i686 目标则不能并且仍然在 collect2 中包含 crt0.o。例如:

arm-eabi-g++ -v -T my_script.ld ...

给我:

collect2 ... /opt/lib/gcc/arm-eabi/4.8.0/../../../../arm-eabi/lib/crt0.o ...

因此:

crt0.S:101: multiple definition of `_start'

似乎该STARTUP指令被完全忽略(除非指定该指令,否则 powerpc 目标也使用其默认 crt0 STARTUP)并且无法禁用默认 crt0。

是否有一种可移植的方式来链接另一个启动文件?

我的启动文件使用libgcc函数(调用ctors和dtors),所以需要crtbegin.ocrtend.o等等,所以我想避免-nostartfiles禁用的选项crt*.o- 我只需要禁用crt0.o

谢谢

4

2 回答 2

5

我正在尝试将程序与我自己的启动文件链接...
GCC驱动程序用于链接程序...

在这种情况下,您还必须向 GCC提供-nostartfiles标志。

于 2013-05-19T21:59:41.243 回答
2

此限制确实迫使您使用-nostartfiles(我更喜欢-nostdlib)禁用默认启动文件。然后,您需要自己构建运行时对象列表。gcc 可以选择-print-file-name打印编译时使用的库的绝对路径(crtbegin.o、crtend.o、libgcc.a...)。例如:arm-eabi-g++ <FLAGS> -print-file-name=crtbegin.o

这是我使用的 GNU Make 宏(提供 gcc 和 cflags):

define m.in/toolchain/gnu/locate =
$(strip
  $(shell $(m.in/toolchain/gnu/bin/gcc) $(m.in/toolchain/gnu/cflags) \
          -print-file-name=$(m.in/argv/1))
)
endef

crtn := $(call m.in/toolchain/gnu/locate, crtn.o)
于 2016-01-23T07:48:52.167 回答