除了使用
-nostdlib
并自己链接crt1.o -lc -lgcc
之外,是否有更简单的方法可以防止gcc链接crtbegin[S].o
和crtend[S].o
?这些文件不是很大,但我正在尝试制作小型二进制文件,并希望删除无用的C ++支持代码,因为对于C程序而言不需要它们。(大概是,gcc即使对于C程序也链接它们,以防您在C++库中使用全局对象变量。我会免除每个人对该如何在C ++模块中生成安全的一次性初始化调用,而不是在main
之前初始化全局对象的怒吼......)
我不反对修改gcc specs
文件,使C++支持文件的链接取决于某个条件,但我不确定如何做到这一点。也许已经有一个好的方法了吗?
__attribute__ ((constructor))
(以及destructor
)函数。(虽然我并不是一个C++专家,但据说为了符合标准,在调用main()
之前必须先执行全局构造函数。) - cafgcc
进行编译,然后直接使用系统链接器(可能是ld
)进行实际的链接步骤,以便更好地控制链接吗? - CB Baileyspecs
文件进行黑客攻击以跳过链接那些文件;在shell中编写了一个gcc包装器,如下:exec /usr/bin/gcc --specs /usr/lib/gcc/specs-no-c++ "$@"
。对我来说,这是最简单的方法。 - Low power