C++ 有没有一种简单的方法可以让gcc省略crtbegin.o/crtend.o?
除了自己使用C++ 有没有一种简单的方法可以让gcc省略crtbegin.o/crtend.o?,c++,c,linux,gcc,C++,C,Linux,Gcc,除了自己使用-nostlib和链接crt1.o-lc-lgcc之外,还有什么简单的方法可以防止gcc链接crtbegin[S].o和crtend[S].o?这些文件不是那么大,但我正在玩小二进制文件,并且想删除C程序不需要的无用的C++支持代码。(假设GCC甚至连C程序都可以使用,如果你使用的是C++对象库,全局对象变量。我会让大家知道它应该如何生成安全的一次性初始化调用,无论是在C++模块中引用全局对象,而不是在主< ……>初始化之前的全局对象) 我不反对黑客攻击GCC-规范> >代码>文件,
-nostlib
和链接crt1.o-lc-lgcc
之外,还有什么简单的方法可以防止gcc链接crtbegin[S].o
和crtend[S].o
?这些文件不是那么大,但我正在玩小二进制文件,并且想删除C程序不需要的无用的C++支持代码。(假设GCC甚至连C程序都可以使用,如果你使用的是C++对象库,全局对象变量。我会让大家知道它应该如何生成安全的一次性初始化调用,无论是在C++模块中引用全局对象,而不是在<代码>主< <代码>……>初始化之前的全局对象)
<>我不反对黑客攻击GCC-<代码>规范> >代码>文件,以使C++支持文件有条件地链接到这样的情况,但我不知道我该怎么做。也许已经有一个好方法了?我想您需要
-nostartfiles
选项。不管怎样,这就是我所需要的嵌入式东西。我相信\uu属性\uuu((构造函数))
(和析构函数
)函数也需要它们。(我不是一个C++专家,但是我听说,要符合标准,在代码<主代码()/代码>之前,必须有全局构造函数发生。)cAF:我的印象是C++标准指定在程序调用和使用对象的第一个时间之间的指定时间调用构造函数。(当然,除了一个对象引用另一个对象并因此调用“第一次使用”的情况外,顺序未明)。您是否有相反的引用?可能是“吮吸鸡蛋的教导”,但您是否尝试过使用gcc
编译并直接转到您的系统链接器(可能是ld
)对于实际的链接步骤,以便您能够更好地控制链接?@Charles:我知道我可以做到,但是我必须自己去找标准的库文件和库路径。这比gcc-nostlib
稍微痛苦一些。我目前正在使用specs
文件黑客来跳过这些文件的链接;我编写了一个gcc包装器n shell,比如exec/usr/bin/gcc--specs/usr/lib/gcc/specs-no-c++“$@”
。对我来说这是最简单的方法。这是一个好的开始(没有双关语),但它也省略了crt1.o
,其中包含\u start
入口点。@R..:我确信您可以在链接器脚本中设置入口点。是的,我知道我可以这样做,但这比找到crt1.o
的路径并使用gcc
命令行进行链接要糟糕得多。基本上我是在寻找与GCC最接近的一种方法是不需要用不必要的东西链接,答案似乎是没有的。<代码> CRT1. O./COD>不是C++支持的垃圾。它是C代码的正常入口点,它提取了<代码> ARC> <代码> >代码> ARGV < /C>,以及从KEN给程序的初始状态的环境指针。el,并使用它调用exit(main(argc,argv))
顺便问一下,gcc-print file name=crt1.o
将为您提供crt1.o
的路径名,您可以在传递-nostartfiles
后使用它重新添加它。有人能解释一下上面的脚本中发生了什么吗?@4arkn1gh7:-wrapper
选项让gcc通过wrapper pro调用运行的外部命令包装程序是一个shell脚本,它在调用请求的命令之前删除与*crtbegin*.o
或*crtend*.o
匹配的任何参数。它只是在命令行内联编写,而不是将脚本保存到文件中。
gcc -wrapper sh,-c,'z= ; for i ; do [ "$z" ] || set -- ; z=1 ;
case "$i" in *crtbegin*.o|*crtend*.o) ;; *) set -- "$@" "$i" ;; esac ;
done ; exec "$0" "$@"'