0x00007ffff7dd5f10 0x00007ffff7df4b20 Yes /lib64/ld-linux-x86-64.so.2
如何为调试中的主程序获取此输出?
我知道gdb禁用了ASLR,我可以自己检查ELF文件来找出原因,但是也必须有一种通过gdb的方法。
(背景:我正在使用gdb的mi,并且我可以通过解析共享库负载消息来大致了解事物的位置。但是它永远不会为主程序发送此类消息最重要的事情。)
谢谢!
#1 楼
您可以执行以下操作:info inferior
或print getpid()
给您一个进程ID shell pmap -x {the process id}
给您一个进程的内存映射(它是不是gdb的功能,pmap是其他shell命令,但是比分析ELF更好一些。您还可以使用
shell cat /proc/{pid}/maps
文件(据我了解pmap只是解析并打印其内容)您会看到类似的内容(这是我正在调试的名为opt的过程的结果):
6648: /home/ubuntu/llvm-5.0.1.src/build/bin/opt
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 100524 36380 8 r-x-- opt
0000000000400000 0 0 0 r-x-- opt
000000000682a000 4176 356 296 r---- opt
000000000682a000 0 0 0 r---- opt
0000000006c3e000 628 76 76 rw--- opt
0000000006c3e000 0 0 0 rw--- opt
0000000006cdb000 684 480 480 rw--- [ anon ]
0000000006cdb000 0 0 0 rw--- [ anon ]
00007ffff6908000 1792 1056 8 r-x-- libc-2.23.so
00007ffff6908000 0 0 0 r-x-- libc-2.23.so
00007ffff6ac8000 2048 0 0 ----- libc-2.23.so
00007ffff6ac8000 0 0 0 ----- libc-2.23.so
00007ffff6cc8000 16 16 16 r---- libc-2.23.so
00007ffff6cc8000 0 0 0 r---- libc-2.23.so
00007ffff6ccc000 8 8 8 rw--- libc-2.23.so
00007ffff6ccc000 0 0 0 rw--- libc-2.23.so
00007ffff6cce000 16 12 12 rw--- [ anon ]
00007ffff6cce000 0 0 0 rw--- [ anon ]
...
...
如果我正确理解了您的问题该行
0000000000400000 100524 36380 8 r-x-- opt
是您所需要的。
评论
谢谢。我知道gdb不是rce工具,但它确实让我感到困扰,很难找到诸如找到目标在内存中的加载位置之类的基本信息。另一个示例是刚在最近才添加的starti命令。无论如何,感谢您解决此问题。
–伯恩·费曼
18-10-11在21:05
#2 楼
info file
显示当前进程的内存映射:Local exec file:
`/bin/less', file type elf64-x86-64.
Entry point: 0x402080
0x0000000000400238 - 0x0000000000400254 is .interp
0x0000000000400254 - 0x0000000000400274 is .note.ABI-tag
0x0000000000400274 - 0x0000000000400298 is .note.gnu.build-id
0x0000000000400298 - 0x00000000004002e0 is .gnu.hash
0x00000000004002e0 - 0x0000000000400b20 is .dynsym
0x0000000000400b20 - 0x0000000000400e7d is .dynstr
0x0000000000400e7e - 0x0000000000400f2e is .gnu.version
0x0000000000400f30 - 0x0000000000400fa0 is .gnu.version_r
0x0000000000400fa0 - 0x0000000000401000 is .rela.dyn
0x0000000000401000 - 0x0000000000401708 is .rela.plt
0x0000000000401708 - 0x0000000000401722 is .init
0x0000000000401730 - 0x0000000000401bf0 is .plt
0x0000000000401bf0 - 0x0000000000415824 is .text
0x0000000000415824 - 0x000000000041582d is .fini
0x0000000000415840 - 0x000000000041bd67 is .rodata
0x000000000041bd68 - 0x000000000041c90c is .eh_frame_hdr
0x000000000041c910 - 0x00000000004208e4 is .eh_frame
0x0000000000620e00 - 0x0000000000620e08 is .init_array
0x0000000000620e08 - 0x0000000000620e10 is .fini_array
0x0000000000620e10 - 0x0000000000620e18 is .jcr
0x0000000000620e18 - 0x0000000000620ff8 is .dynamic
0x0000000000620ff8 - 0x0000000000621000 is .got
0x0000000000621000 - 0x0000000000621270 is .got.plt
0x0000000000621280 - 0x000000000062500c is .data
0x00007fffff4001c8 - 0x00007fffff4001ec is .note.gnu.build-id in /lib64/ld-linux-x86-64.so.2
0x00007fffff4001f0 - 0x00007fffff4002ac is .hash in /lib64/ld-linux-x86-64.so.2
0x00007fffff4002b0 - 0x00007fffff40038c is .gnu.hash in /lib64/ld-linux-x86-64.so.2
0x00007fffff400390 - 0x00007fffff400630 is .dynsym in /lib64/ld-linux-x86-64.so.2
结尾处没有文件名的行是主可执行文件的行。
评论
谢谢!在我的特定情况下,我需要段而不是段,因此我只需要使用该信息进行粗略的舍入....但是看来这与原始gdb一样好。
–伯恩·费曼
18-10-11在21:06
评论
命令行中的pmap -x [pid](linux.die.net/man/1/pmap)可能会在没有gdb的情况下为您提供帮助还有命令info proc映射
您可能正在寻找“ info proc stat”->“文本开始”