对于带有嵌入位码的二进制文件(即使用 编译-fembed-bitcode)。我怎样才能提取该部分,以便我可以像任何其他位码文件一样使用该位码文件,例如运行opt或llvm-dis
作为测试用例,我有这个 hello-world 程序:
// hello.cpp
#include<iostream>
int main() {
std::cout << "hello world";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译为:clang++ -O2 test.cpp -o test.o -fembed-bitcode -c
显示其中objdump有一个__bitcode部分:
objdump -h test.o
test.o: file format Mach-O 64-bit x86-64
Sections:
Idx Name Size Address Type
0 __text 000002eb 0000000000000000 TEXT
1 __gcc_except_tab 00000068 00000000000002ec DATA
2 __cstring 0000000c 0000000000000354 DATA
3 __bitcode 00002bc0 0000000000000360 DATA
4 __cmdline 00000046 0000000000002f20 DATA
5 __compact_unwind 00000060 0000000000002f68 …Run Code Online (Sandbox Code Playgroud) 我对组装很陌生,我正在尽力学习它。我参加了一门课程来学习它,他们提到了一个非常补救的 Hello World 示例,我反编译了它。
原始c文件:
#include <stdio.h>
int main()
{
printf("Hello Students!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是使用以下命令反编译的:
C:> objdump -d -Mintel HelloStudents.exe > disasm.txt
Run Code Online (Sandbox Code Playgroud)
反编译(组装):
push ebp
mov ebp, esp
and esp, 0xfffffff0
sub esp, 0x10
call 401e80 <__main>
mov DWORD PTR [esp], 0x404000
call 4025f8 <_puts>
mov eax, 0x0
leave
ret
Run Code Online (Sandbox Code Playgroud)
我在将这个输出从反编译映射到原始 C 文件时遇到问题有人可以帮忙吗?
非常感谢!
我"objdump -d"是一个可执行文件,例如/ bin/ls,我发现汇编代码中没有任何主函数.为什么?
我正在处理一个大型可执行文件,我没有源代码(长篇故事).
我想从中提取几个函数的二进制代码 - 并尝试从我自己的程序中调用它们.我正在寻找的函数都是从相同的源文件(在Linux上使用gcc)编译的,如果重要的话.
我可以使用objdump看到函数的二进制代码.有没有什么方法可以说服工具转储函数的二进制代码 - 没有别的东西,没有拆解?
基本上,如果定义函数的C文件被称为foo.c,我想得到foo.o(我实际上更喜欢foo.So,但这不会存在于可执行文件中).可以用objdump,readelf或其他一些方法完成吗?
如果重要的话,这些功能是独立的.
谢谢!
对于实验室,我需要知道我写的汇编的十六进制指令.例如,我有bang.s:
movl 0xaaaaaaaa 0xbbbbbbbb
push 0xcccccccc
ret
Run Code Online (Sandbox Code Playgroud)
现在我想得到这些指令的十六进制代码.我该如何使用cc和/或objdump完成此操作?
我试过了:
objdump -S bang.s
Run Code Online (Sandbox Code Playgroud)
但我得到"文件格式无法识别"
我使用的是带有 AVR Atmega2560 芯片的 Arduino Mega 2560。我正在使用 Windows 上的 Arduino IDE 1.8.4 对其进行编程,该 IDE 附带 avr-objdump 2.26 和 avr-g++ 4.9.2。
我的程序或多或少可以工作,但是当尝试检查生成的程序集时,objdump 似乎没有生成正确的输出。
执行中
avr-objdump -D -S -m avr:6 "arduino_build_948544\sketch\mysketch.ino.cpp.o" > mysketch.asm
Run Code Online (Sandbox Code Playgroud)
似乎成功了,但是对于像这样简单的函数
void sleep_example() {
SMCR = 1;
__asm__("sleep");
}
Run Code Online (Sandbox Code Playgroud)
拆卸看起来基本上是随机的:
Disassembly of section .gnu.lto__Z13sleep_examplev.af7e500a:
00000000 <.gnu.lto__Z13sleep_examplev.af7e500a>:
0: 78 9c mul r7, r8
2: 63 66 ori r22, 0x63 ; 99
4: c0 04 cpc r12, r0
6: 52 40 sbci r21, 0x02 ; 2
8: fc 18 sub r15, …Run Code Online (Sandbox Code Playgroud) 我有一个十六进制偏移量,比如说0xcccddd。使用gdb info symbol 0xcccdddI 可以获得符号名称,例如fn()在section_name.
如何使用readelf或objdump命令或任何其他命令而不运行 gdb 来执行此操作?
编辑: 使用以下命令后
objdump -d --start-address 0xcccddd --stop-address 0xcccdde filename.axf
Run Code Online (Sandbox Code Playgroud)
我正进入(状态
filename.axf: file format elf32-little
objdump: can't disassemble for architecture UNKNOWN!
Run Code Online (Sandbox Code Playgroud) 我对gcc如何编码相对跳跃感到有点困惑.我有以下内容:
int main(void)
{
__asm__ __volatile__(
"jmp label\n"
"label:\n"
"nop\n"
);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
构建this(gcc -c -o test.o test.c)显示以下(objdump -M intel -d test.o):
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: eb 00 jmp 6 <label>
0000000000000006 <label>:
6: 90 nop
...
Run Code Online (Sandbox Code Playgroud)
rasm2 -d eb00显示jmp 2,这意味着正在以2的偏移量执行跳转.现在,我已经理解相对跳跃的偏移量被添加到当前值eip,该值应该指向下一条指令(即nop).这种编码让我觉得偏移是相对于jmp自身的地址.不应该jmp被编码为jmp 0,因为nop已经在label?
我试图了解事物在内存中的存储位置,例如全局和静态变量(.data,如果未初始化为零,)等。
我试图寻找/考虑的是一个宏,如下所示:
#define thisInteger 100
Run Code Online (Sandbox Code Playgroud)
这可以使用 objdump 找到吗?
此外,如果我将它分配给一个新变量,如下所示,在哪里可以找到它(在 .data 中猜测):
#define THIS_INTEGER 100
int newVariable = THIS_INTEGER;
Run Code Online (Sandbox Code Playgroud)