使用-nostdlib
进行编译/链接似乎会阻止静态初始化,即使我添加了自己的带有.init
/.fini
部分的crti.s和crtn.s。
有没有解决方法可以让g++生成插入.init
中的静态初始化代码或可以手动调用的代码?
这是我尝试过的:
g++ -o test.o -c -fno-use-cxa-atexit test.cc # has _start (entry point)
# that calls _init and _main
as -o crti.o crti.s # has _init in section .init
as -o crtn.o crtn.s
g++ -o test ./crti.o test.o -nodefaultlibs -nostartfiles ./crtn.o
-nodefaultlibs
单独包括静态初始化代码和调用,但是强制使用libc-_start/_init。
-nodefaultlibs -nostartfiles
允许我使用自己的 _start / _init,但不包括静态初始化代码或调用。
g++ -o test ./crti.o ./crtn.o test.o -Wl, -nodefaultlibs -nostartfiles
。根据您的用法,我认为您只想要包含启动文件并且似乎对标准库中的其他库满意? - Pavan Manjunathmain
函数之前会自动进行构造/初始化。由于编译器决定使用哪些模板实例化,因此很难显式地调用构造函数。这就是为什么我需要包含静态初始化代码的原因。 - Thomas-nostartfiles
ж— жі•и®©ж€‘з”Ёи‡Єе·±зљ„д»Јз Ѓж›їжЌўlibc-_start
гЂ‚ - Thomas-nodefaultlibs
(否则必须存在libstdc++等)。b) 将自己的目录挂载到libc所在的位置。c) 构建自定义的crti.o
和crtn.o
,自定义_start
,空的crt1.o
并使用原始的crtbegin.o
和crtend.o
(这些包含初始化调用),并将所有内容复制到挂载的目录中。 - Thomas