gcc:使用nostlib编译时出现分段错误
我正在试验入口点,但遇到了一个故障 项目c: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
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