gcc gc-sections选项删除crtbegin / crtend对象

时间:2016-05-15 13:35:31

标签: c gcc linker

我尝试使用gc-sectionsffunction-sectionsfdata-sections来优化可执行文件。我还给链接器提供了带-u(undefined)的init函数。我的init函数和添加的所有使用的符号以及其他未使用的符号都被成功删除。一切都好。

但是crtbegincrtend对象也被消除了,这些对象由gcc放置。在那种情况下,我的可执行文件不起作用...是否有任何方法可以在可执行文件中保留crtbegincrtend个对象。

注意:KEEP()的链接中存在crtbegin指令,例如:KEEP(*crtbegin.o(.ctors)) KEEP(*crtbegin?.o(.ctors))等。

1 个答案:

答案 0 :(得分:1)

它解决了。可执行文件崩溃并发出异常。由于gc-section选项正在删除crtbegin函数,例如__do_global_dtors_aux call__do_global_dtors_aux,frame_dummy,call_frame_dummy等。因此导致程序崩溃。

但是当您将init部分保留在链接器中时: “KEEP(*(。init))”,然后保留这些功能,而gc-sections选项清除其他未使用的符号。然后我的程序成功运行而没有任何崩溃。