C 静态链接未在库api strlen()和put()的gdb中提供代码
我静态链接代码和它的三行代码,静态链接后我将查看反汇编代码,但在清单中我没有得到库api strlen()和put()C 静态链接未在库api strlen()和put()的gdb中提供代码,c,gdb,disassembly,C,Gdb,Disassembly,我静态链接代码和它的三行代码,静态链接后我将查看反汇编代码,但在清单中我没有得到库api strlen()和put() (gdb)反汇编主 主功能的汇编程序代码转储: 0x0000000000404B4:推送%rbp 0x0000000000404B5:mov%rsp,%rbp 0x0000000000404B8:子$0x10,%rsp 0x00000000004004bc:movq$0x0,-0x8(%rbp) 0x0000000000404C4:mov-0x8(%rbp),%rax 0x00
(gdb)反汇编主
主功能的汇编程序代码转储:
0x0000000000404B4:推送%rbp
0x0000000000404B5:mov%rsp,%rbp
0x0000000000404B8:子$0x10,%rsp
0x00000000004004bc:movq$0x0,-0x8(%rbp)
0x0000000000404C4:mov-0x8(%rbp),%rax
0x0000000000404C8:mov%rax,%rdi
0x00000000004004cb:callq 0x4016c0
0x000000000040400:LEVEQ
0x0000000000404D1:retq
(gdb)拆卸推杆
函数puts的汇编程序代码转储:
=>0x00000000004016c0:mov%rbx,-0x18(%rsp)
0x00000000004016c5:mov%rbp,-0x10(%rsp)
0x00000000004016ca:mov%rdi,%rbp
0x00000000004016cd:mov%r12,-0x8(%rsp)
0x00000000004016d2:子$0x18,%rsp
0x00000000004016d6:callq 0x40b870
0x00000000004016db:mov 0x2a816e(%rip),%r8#0x6a9850
0x00000000004016e2:mov%rax,%r12
0x00000000004016e5:cmpw$0x0,(%r8)
0x00000000004016ea:mov%r8,%rbx
0x00000000004016ed:js 0x401740
0x00000000004016ef:mov 0x88(%r8),%rdx
0x00000000004016f6:mov%fs:0x10,%r9
0x00000000004016ff:cmp%r9,0x8(%rdx)
0x0000000000401703:je 0x40173c
(gdb)清单
1#包括
2整数
3主要内容()
4 {
5字符*p=NULL;
6 printf(“%s\n”,p);
7 }
(gdb)q
它总是显示我的代码,而不是库api,即使我将断点保留在put()/strlen()中
我使用-ggdb进行编译,所以它应该有调试信息 您已经使用
-ggdb
构建了代码。您没有用-ggdb
重建libc.a
内核,因此strlen
没有调试信息
根据我的理解,如果我静态链接,它应该有libc的源代码
你的理解是错误的。只有使用-ggdb
构建的代码(即重新构建的代码)才能获取调试信息
我使用-ggdb进行编译,所以它应该有调试信息 您已经使用
-ggdb
构建了代码。您没有用-ggdb
重建libc.a
内核,因此strlen
没有调试信息
根据我的理解,如果我静态链接,它应该有libc的源代码
你的理解是错误的。只有使用
-ggdb
构建的代码(即您重建的代码)才能获取调试信息。您的意思是什么?这是puts函数的程序集-但是,我猜该函数甚至没有调试信息,也没有libcAlso的源代码,我的strlen是用assembler编写的-106../sysdeps/x86_64/strlen.s:没有这样的文件或目录。
我使用-ggdb进行编译,所以它应该有调试信息。根据我的理解,如果我静态链接,它应该有libc的源代码。如果我不是静态构建,它甚至不会反汇编put()或strlen()。你是什么意思?这是puts函数的程序集-但是,我猜该函数甚至没有调试信息,也没有libcAlso的源代码,我的strlen是用assembler编写的-106../sysdeps/x86_64/strlen.s:没有这样的文件或目录。
我使用-ggdb进行编译,所以它应该有调试信息。根据我的理解,如果我静态链接,它应该有libc的源代码。如果我不静态构建,它甚至不会反汇编put()或strlen()。
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004004b4 <+0>: push %rbp
0x00000000004004b5 <+1>: mov %rsp,%rbp
0x00000000004004b8 <+4>: sub $0x10,%rsp
0x00000000004004bc <+8>: movq $0x0,-0x8(%rbp)
0x00000000004004c4 <+16>: mov -0x8(%rbp),%rax
0x00000000004004c8 <+20>: mov %rax,%rdi
0x00000000004004cb <+23>: callq 0x4016c0 <puts>
0x00000000004004d0 <+28>: leaveq
0x00000000004004d1 <+29>: retq
(gdb) disassemble puts
Dump of assembler code for function puts:
=> 0x00000000004016c0 <+0>: mov %rbx,-0x18(%rsp)
0x00000000004016c5 <+5>: mov %rbp,-0x10(%rsp)
0x00000000004016ca <+10>: mov %rdi,%rbp
0x00000000004016cd <+13>: mov %r12,-0x8(%rsp)
0x00000000004016d2 <+18>: sub $0x18,%rsp
0x00000000004016d6 <+22>: callq 0x40b870 <strlen>
0x00000000004016db <+27>: mov 0x2a816e(%rip),%r8 # 0x6a9850 <stdout>
0x00000000004016e2 <+34>: mov %rax,%r12
0x00000000004016e5 <+37>: cmpw $0x0,(%r8)
0x00000000004016ea <+42>: mov %r8,%rbx
0x00000000004016ed <+45>: js 0x401740 <puts+128>
0x00000000004016ef <+47>: mov 0x88(%r8),%rdx
0x00000000004016f6 <+54>: mov %fs:0x10,%r9
0x00000000004016ff <+63>: cmp %r9,0x8(%rdx)
0x0000000000401703 <+67>: je 0x40173c <puts+124>
(gdb) list
1 #include <stdio.h>
2 int
3 main()
4 {
5 char *p = NULL;
6 printf("%s\n", p);
7 }
(gdb) q