我知道我可以使用-g选项生成调试符号.但是,符号将嵌入目标文件中.gcc可以在结果可执行文件/库之外生成调试符号吗?像Windows VC++编译器的.pdb文件一样.
哪种工具最适合反汇编C++可执行文件?我正在寻找像OllyDbg这样的东西,但是对于Linux.
编辑:对不起,忘了告诉我我也想调试,而不仅仅是看到asm代码.
编辑2:"最好的"我的意思是 - "最好的Windows是OllyDbg - 可以看到asm代码,可以调试,它是用户友好和非常强大.哪一个最适合Linux".
我们知道,在给定地址(包括)之后反汇编指令可以通过以下方式实现:
x/5i address
Run Code Online (Sandbox Code Playgroud)
这将打印5条指令,但如何拆解前一条指令?
我正在调试JIT代码,所以像拆解一行这样的东西不起作用.我可以反汇编包含地址的随机范围:
disas address-10 address+10
Run Code Online (Sandbox Code Playgroud)
但这很尴尬,你会看到(bad)(希望不在中间!)并开始担心你没有得到正确的东西.我正在寻找的是:
x/-5i address
Run Code Online (Sandbox Code Playgroud)
,但以上将无法正常工作.
灵感来自这个问题
我想知道INT 21h是一个概念.现在,我对内部有一些非常生疏的知识,但没有那么多细节.我记得在C64中你有定期中断和不可屏蔽中断,但我的知识在这里停止.你能告诉我一些线索吗?这是DOS相关策略吗?
Dump of assembler code for function foo@plt:
0x0000000000400528 <foo@plt+0>: jmpq *0x2004d2(%rip) # 0x600a00 <_GLOBAL_OFFSET_TABLE_+40>
0x000000000040052e <foo@plt+6>: pushq $0x2
0x0000000000400533 <foo@plt+11>: jmpq 0x4004f8
(gdb) disas 0x4004f8
No function contains specified address.
Run Code Online (Sandbox Code Playgroud)
我知道0x4004f8是程序联动表的切入点,但为什么我不能disas呢?
debugging ×2
disassembly ×2
gdb ×2
internals ×2
linux ×2
c++ ×1
gcc ×1
interrupt ×1
linux-kernel ×1
low-level ×1
pdb-files ×1
system-calls ×1