我想找出在gdb中调试的程序的基址和图像大小。如图所示,它被加载到内存中。对于共享库,我可以执行“ info sharedlibrary”,这样的输出非常好:

0x00007ffff7dd5f10  0x00007ffff7df4b20  Yes         /lib64/ld-linux-x86-64.so.2


如何为调试中的主程序获取此输出?

我知道gdb禁用了ASLR,我可以自己检查ELF文件来找出原因,但是也必须有一种通过gdb的方法。

(背景:我正在使用gdb的mi,并且我可以通过解析共享库负载消息来大致了解事物的位置。但是它永远不会为主程序发送此类消息最重要的事情。)

谢谢!

评论

命令行中的pmap -x [pid](linux.die.net/man/1/pmap)可能会在没有gdb的情况下为您提供帮助

还有命令info proc映射

您可能正在寻找“ info proc stat”->“文本开始”

#1 楼

您可以执行以下操作:



info inferiorprint 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