c - gcc:使用 nostdlib 编译时出现段错误

标签 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

对象转储:

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   

Valgrind 输出:

 Access not within mapped region at address 0x0

最佳答案

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

用 gdb 设置一些虚拟参数(set args x y z)

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

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

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

http://eli.thegreenplace.net/2012/08/13/how-statically-linked-programs-run-on-linux/ 一些有用的背景信息

关于c - gcc:使用 nostdlib 编译时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22236840/

相关文章:

gcc - 在 g++ 中使用符号 '_end' 会导致段错误

c++ - ld 的奇怪警告

linux - 什么是 gcc 共享库的 .sa 文件?

c - RSA_public_crypt 返回 -1 并且无法解密,带填充的 RSA 2048 位用于加密和解密文件

c - 如何创建一个函数来计算结构数组字符串项中的总字符数?

c - 指向 __attribute__((const)) 函数的函数指针?

c - 通用函数宏和如何抑制特定的 GCC 警告 : "Pointer Type Mismatch in Conditional Expression"

c++ - 链接究竟是如何工作的?

c - 指针时无法使用箭头表示法访问结构数据

c - C : how to pass them as an argument to a function, 中未调整大小的矩阵在我的代码中操作并返回它们?