标签: objdump

如何从 MachO 二进制文件中提取 __bitcode/__bundle 部分

对于带有嵌入位码的二进制文件(即使用 编译-fembed-bitcode)。我怎样才能提取该部分,以便我可以像任何其他位码文件一样使用该位码文件,例如运行optllvm-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)

llvm objdump objcopy llvm-ir bitcode

2
推荐指数
1
解决办法
1304
查看次数

map exe反编译回C语言

我对组装很陌生,我正在尽力学习它。我参加了一门课程来学习它,他们提到了一个非常补救的 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 文件时遇到问题有人可以帮忙吗?

非常感谢!

c windows assembly decompiling objdump

2
推荐指数
1
解决办法
81
查看次数

为什么有些可执行文件没有主要功能?

我"objdump -d"是一个可执行文件,例如/ bin/ls,我发现汇编代码中没有任何主函数.为什么?

objdump

1
推荐指数
1
解决办法
1195
查看次数

如何从已编译的ELF可执行文件中提取一些函数(无需反汇编)?

我正在处理一个大型可执行文件,我没有源代码(长篇故事).

我想从中提取几个函数的二进制代码 - 并尝试从我自己的程序中调用它们.我正在寻找的函数都是从相同的源文件(在Linux上使用gcc)编译的,如果重要的话.

我可以使用objdump看到函数的二进制代码.有没有什么方法可以说服工具转储函数的二进制代码 - 没有别的东西,没有拆解?

基本上,如果定义函数的C文件被称为foo.c,我想得到foo.o(我实际上更喜欢foo.So,但这不会存在于可执行文件中).可以用objdump,readelf或其他一些方法完成吗?

如果重要的话,这些功能是独立的.

谢谢!

elf objdump readelf

1
推荐指数
1
解决办法
3460
查看次数

gcc汇编到十六进制

对于实验室,我需要知道我写的汇编的十六进制指令.例如,我有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)

但我得到"文件格式无法识别"

assembly hex objdump

1
推荐指数
1
解决办法
3579
查看次数

ARM v7-M指令集解码功能

ARM v7-M指令集是否有任何指令解码器,我可以给它一个操作码作为参数并返回相应的指令类型?

例如: MOV Rd, <op2>

有四种不同的版本取决于<op2>.

  1. 一个简单的寄存器说明符,例如Rm.
  2. 立即移位的寄存器,例如Rm,LSL#4.
  3. 寄存器移位寄存器,例如Rm,LSL Rs.
  4. 立即值,例如#0xE000E000.

我想知道这个版本中的哪一个来自指令的操作码


编者注:操作码是指实际的"十六进制"指令或机器编码.问题是关于汇编程序的助记符.在许多CPU 上,根据参数,前导助记符可以映射到不同的操作码(或机器指令).

compiler-construction arm instruction-set objdump

1
推荐指数
1
解决办法
209
查看次数

avr-objdump 使用 g++ -flto 生成不正确的输出

我使用的是带有 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)

c++ assembly avr objdump avr-gcc

1
推荐指数
1
解决办法
606
查看次数

如何从给定偏移量的 ELF 文件中提取符号名称

我有一个十六进制偏移量,比如说0xcccddd。使用gdb info symbol 0xcccdddI 可以获得符号名称,例如fn()section_name.

如何使用readelfobjdump命令或任何其他命令而不运行 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)

gdb elf objdump readelf

1
推荐指数
1
解决办法
1911
查看次数

x86程序集 - 编码相对jmp

我对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

x86 assembly objdump disassembly radare2

1
推荐指数
1
解决办法
170
查看次数

诸如全局整数之类的宏在内存中存储在哪里?

我试图了解事物在内存中的存储位置,例如全局和静态变量(.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)

c assembly system objdump

1
推荐指数
1
解决办法
166
查看次数