gcc:使用nostlib编译时出现分段错误

gcc:使用nostlib编译时出现分段错误,c,gcc,linker,segmentation-fault,C,Gcc,Linker,Segmentation Fault,我正在试验入口点,但遇到了一个故障 项目c: int main() { return 0; } 编辑和链接: gcc -Wall prog.c -nostdlib -c -o prog.o ld prog.o -e main -o prog.out objdump: Sections: Idx Name Size VMA LMA File off Algn 0 .text 000

我正在试验入口点,但遇到了一个故障

项目c:

int main() {
    return 0;
}
编辑和链接:

 gcc -Wall prog.c -nostdlib -c -o prog.o
 ld prog.o -e main -o prog.out
objdump:

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
0 .text         0000000b  00000000004000b0  00000000004000b0  000000b0  2**2
              CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .eh_frame     00000038  00000000004000c0  00000000004000c0  000000c0  2**3
              CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .comment      0000001c  0000000000000000  0000000000000000  000000f8  2**0
              CONTENTS, READONLY

Disassembly of section .text:
00000000004000b0 <main>:
 4000b0:    55                      push   %rbp
 4000b1:    48 89 e5                mov    %rsp,%rbp
 4000b4:    b8 00 00 00 00          mov    $0x0,%eax
 4000b9:    5d                      pop    %rbp
 4000ba:    c3                      retq   

retq从堆栈顶部获取返回地址并从那里执行。。。问题是,根据Linux执行二进制文件的方式,参数的数量在堆栈上,执行被传输到地址0x1(如果没有给出参数)

使用gdb设置一些伪参数(设置args x y z)

您可以编译并链接调试信息(-g),然后使用gdb 在retq指令(br*0x4000ba)上设置断点并运行程序

执行最后一条指令,观察SIGSEGV地址对应的参数数+1

程序应该通过系统调用而不是retq退出


对于一些有用的背景信息,retq从堆栈顶部获取返回地址并从那里执行。。。问题是,根据Linux执行二进制文件的方式,参数的数量在堆栈上,执行被传输到地址0x1(如果没有给出参数)

使用gdb设置一些伪参数(设置args x y z)

您可以编译并链接调试信息(-g),然后使用gdb 在retq指令(br*0x4000ba)上设置断点并运行程序

执行最后一条指令,观察SIGSEGV地址对应的参数数+1

程序应该通过系统调用而不是retq退出


有关一些有用的背景信息

谢谢,但是如果不包括stdlib,我如何才能退出()?我设法使用带汇编的syscall退出,但我想知道是否有纯c的解决方案@Dimid“纯C”解决方案不可能存在,因为您必须执行
exit
系统调用,而在纯C中无法执行此操作。谢谢,但是如果不包括stdlib,我如何才能退出()?我设法使用带汇编的系统调用退出,但我想知道是否有纯C解决方案@Dimid“纯C”解决方案不存在,因为您必须执行
exit
系统调用,而在纯C中无法执行此操作。
 Access not within mapped region at address 0x0