Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态链接未在库api strlen()和put()的gdb中提供代码_C_Gdb_Disassembly - Fatal编程技术网

C 静态链接未在库api strlen()和put()的gdb中提供代码

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

我静态链接代码和它的三行代码,静态链接后我将查看反汇编代码,但在清单中我没有得到库api strlen()和put()

(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