如何用NDK工具编译带有源代码的库?
如何使用源代码编译库? 我正在使用Android NDK开发本地库. 有时我从logcat收到了崩溃的转储消息. 06-18 15:24:58.545: INFO/DEBUG(24667): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 06-18 15:24:58.545: INFO/DEBUG(24667): Build fingerprint: 'nvidia/harmony/harmony/harmony:2.2/FRF91/20110304.134348:eng/test-keys' 06-18 15:24:58.545: INFO/DEBUG(24667): pid: 25870, tid: 26261 >>> com.andtv
0 2024-02-17
编程技术问答社区
在IBM AIX中,objdump的对应命令是什么?
我无法在IBM AIX 5.1机器中找到objdump命令.实际上,我想从AIX中生成的库中获取汇编指令(拆卸). Linux具有objdump命令和Solaris dis命令来执行此操作. IBM AIX中的等效命令是什么? 解决方案 您可以使用 dis 命令要在AIX上拆卸对象文件,它应带有XLC. 安装GNU Bintools Suite可能会更容易获得Objdump.它可从 aix linux工具箱 . 其他解决方案 我只有一个答案的一部分.跟进@coreystup,我在/opt/ibm/xlc/16.1.0/exe/dis中找到了dis命令(不是bin目录).但这是非常顽固的,似乎不愿意打印到Stdout或stderr上.我确实发现它是通过使用.s上命令行上的.o替换.o来创建的文件名.所以: % /opt/IBM/xlc/16.1.0/exe/dis aix/ktraceback.o % ls -l aix/ktraceback.s -rw-r--
6 2024-01-20
编程技术问答社区
如何将十六进制代码变成X86指令
我正在尝试制作一个脚本或程序,该脚本或程序将采用给定字节(在十六进制中给出),然后将它们转换为x86指令(例如C3-> retq) 我尝试通过在包含 的汇编文件上调用gcc -c来进行操作. retq retq 然后使用脚本将字节插入说" C3 C3",然后使用objdump -d来查看现在所说的内容.但是看来它会弄乱文件的格式,除非我只通过了与原始指令字节相同的说明. 我使用SSH,Bash终端在Raspbian Pi(基于Linux的操作系统)上运行它.我正在使用bash shell脚本和python,以及此处列出的工具,以及gdb. 解决方案 拆卸平面二进制文件:objdump -D -b binary -m i386 foo.bin.或使用来自汇编源的.byte指令创建对象文件,例如将.byte 0xc3放入foo.s然后gcc -c foo.s然后objdump -d foo.o
6 2023-12-16
编程技术问答社区
组装远端调用或远端跳转(j*指令)。
我正在尝试创建一个调度表,该表更改了由AllocateMemoryOnRemoteProcess分配的另一个地址中的某些指令的位置. 我遇到的问题之一几乎全部Calls,各种Jumps是near和relative,只要我将组件加载到新位置,这些说明就不会工作. 我知道,我应该将这些说明转换为far jump或far call我在谷歌搜索过程中看到的一种解决方案之一是使用push和ret喜欢: push 0xdeadbeef ret 或某人建议使用寄存器进行绝对寻址: mov %eax,0xdeadbeef jmp %eax 在我的情况下,这些解决方案将无法使用,因为只要我处于函数例程,更改堆栈状态或在第二种情况下更改寄存器,例如%eax会导致故障. 某人在 > 呼叫Far(使用OpCode 9a)跳到绝对段并偏移. 即,这就像一次设置CS和?ip. 因此,似乎我应该将opcode与far calls一起使用far calls,但这仅适用于
2 2023-12-16
编程技术问答社区
objdump如何发射英特尔语法?
如何告诉objdump在英特尔语法中发射汇编,而不是默认的AT&T语法? 解决方案 您要寻找的是-M intel.使用如下. objdump -M intel -d program_name 其他解决方案 如果您还需要Intel mnemonic代码(而不是AT&T mnemonic代码),则可以使用: objdump -M intel intel-mnemonic -D
0 2023-12-16
编程技术问答社区
32位结构中的DS段寄存器
我一直在研究如何通过拆卸C代码在X86架构中处理浮点操作.所使用的操作系统是64位Linux,而代码是为32位机器编译的. 这是C源代码: #include #include int main(int argc, char *argv[]) { float a, b; float c, d; printf("%u\n",sizeof(float)); a = FLT_MAX; b = 5; c = a / b; d = (float) a / (float) b; printf("%f %f \n",c,d); return 0; } 这是32位EXE的主要功能的拆卸版本: 804841c: 55 push ebp 804841d: 89 e5 mov
2 2023-12-15
编程技术问答社区
为什么MOV%AX,%DS组装+拆卸为MOV%EAX,%ds,与原件不一致?
test.s .text .global _start _start: xor %ax, %ax mov %ax, %ds mov %ax, %ss mov %ax, %es mov %ax, %fs mov %ax, %gs 我通过这样做 获得了拆卸代码文件 $ x86_64-elf-gcc -g -c -O0 -m32 -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables .\test.S $ x86_64-elf-ld .\test.o -m elf_i386 -Ttext=0x7c00 -o test.elf $ x86_64-elf-objdump -x -d -S -m i386 ./test.elf > test_dis.txt test_dis.txt ./test.elf
6 2023-12-15
编程技术问答社区
为什么objdump显示这个汇编语言指令的操作码为空?
我有以下汇编代码: global _start section .text _start: add byte [eax], al 编译和链接后,我尝试查看opcode: $ objdump -d eax.o eax.o: file format elf32-i386 Disassembly of section .text: 00000000 : ... $ 为什么我要获得零opcode? 解决方案 此指令: add byte [eax], al 编码为两个字节 0x00: Opcode Instruction Op/En 64-bit Mode Compat/Leg Mode Description 00 /r ADD r/m8, r8 MR Valid Valid Add r8 to r/m8. objdump 默认情
2 2023-12-15
编程技术问答社区
用GCC将C语言编译成32位汇编,与书中的内容不符
我一直在试图将此C程序编译为组装,但它的工作状况不佳. 我正在阅读 丹尼斯·尤里切夫(Dennis Yurichev)的初学者逆向工程,但我没有获得相同的输出.这是一个简单的Hello World声明.我正在尝试获得32位输出 #include int main() { printf("hello, world\n"); return 0; } 这是本书所说的输出应为 的. main proc near var_10 = dword ptr -10h push ebp mov ebp, esp and esp, 0FFFFFFF0h sub esp, 10h mov eax, offset aHelloWorld ; "hello, world\n" mov [esp+10h+var_10], eax call _printf mov eax, 0
0 2023-12-15
编程技术问答社区
GNU汇编器X86指令的后缀如 "mov.s "中的".s "是如何工作的?
gnu汇编器似乎具有某些手段来控制要发射的opcode的替代形式.例如 .intel_syntax noprefix mov eax, ecx mov.s eax, ecx 使用as test.s -o test.o && objdump -d test.o -M intel处理上述代码给出以下拆卸: 0: 89 c8 mov eax,ecx 2: 8b c1 mov eax,ecx 我们可以看到,.s后缀似乎可以切换89 opcode到8b版本(并适当更改modrm字节). 这种语法如何在气体中起作用?我找不到任何相关文档. 解决方案 与Binutils 2.29现在的指令后缀现在为 info Pages .早些时P> 9.15.4.1指令命名 [SNIP] 可以通过可选的助记符指定不同的编码选项. .s 后缀交换2寄存器操作数在从一个寄存
8 2023-12-15
编程技术问答社区
什么是寄存器%eiz?
在以下我使用objdump倾倒的汇编代码中: lea 0x0(%esi,%eiz,1),%esi 什么是寄存器%eiz?前面的代码是什么意思? 解决方案 参见为什么GCC LEA EIZ?: 显然%eiz是一个伪注册的人,始终评估为零(例如MIPS上的r0). ... 我最终找到了Binutils Guru Ian Lance Taylor的邮件列表帖子,其中揭示了答案.有时,GCC会在代码流中插入NOP说明,以确保正确的对齐方式和类似的内容. NOP指令需要一个字节,因此您认为您可以根据需要添加尽可能多的.但是,根据伊恩·兰斯·泰勒(Ian Lance Taylor)的说法,芯片执行一项长期说明比许多简短的说明要快.因此,他们没有插入七个NOP说明,而是使用一个Bizarro Lea,它消耗了七个字节,在语义上等同于NOP. 其他解决方案 (游戏很晚,但这似乎是一个有趣的补充):它根本不是登记册,它是Intel指令编码的怪癖.当使用MO
20 2023-12-15
编程技术问答社区
如何反汇编、修改、然后重新汇编一个Linux可执行文件?
无论如何可以做到吗?我已经使用了objdump,但是这不会产生我所知道的任何汇编器所接受的组装输出.我希望能够更改可执行文件中的说明,然后在之后对其进行测试. 解决方案 我认为没有任何可靠的方法可以做到这一点.机器代码格式非常复杂,比汇编文件更复杂.实际上不可能采用编译的二进制(例如,以精灵格式),并产生一个源组件程序,该程序将编译为相同(或类似的二进制).要了解差异,请比较GCC的输出直接与汇编器(gcc -S)与可执行文件上的OBJDUMP的输出(objdump -D). 我能想到两个主要的并发症.首先,机器代码本身不是与汇编代码的1比1对应关系,因为指针偏移之类的东西. 例如,将C代码视为Hello World: int main() { printf("Hello, world!\n"); return 0; } 此编译为x86汇编代码: .LC0: .string "hello" .text
0 2023-12-15
编程技术问答社区
如何使用/安装GNU binutils (objdump)
我需要在Windows上运行的应用程序中使用objdump和readelf命令.我知道我可以安装cygwin来使用它们.我不想使用cygwin的原因是因为我想将其散布.另外,我不知道如何安装cygwin.结果,我相信我需要的是 for win32 for win32 该链接指出这些库是无服务器的. "可执行文件仅取决于Microsoft C-runtime(MSVCRT.DLL),而不取决于Cygwin Tools提供的仿真层" 无论如何,一旦我转到该链接,我就不知道如何安装它. 具体来说,我想使用>>此工具 我将不胜感激,如果有人可以将我指向我的应用程序如何使用objdump and Readelf(Cygwin中的Binutils)的正确方向. 解决方案 它们已经被编译,可以从在这里! 下载后,它们将位于bin目录中: 然后,您将通过通过相同的args在Linux上使用它的方式使用它.
4 2023-12-05
编程技术问答社区
C语言库似乎没有被链接到对象文件中。
我正在使用这样的程序. #include #include int main () { int x = sin(14); printf("hello"); return 0; } 和Ephemient /a> libc.so和libm.so(用于数学函数)应该与程序链接,尽管当我在对象文件上运行OTool(类似于OBJDUMP)时,带有打印共享库的选项" -l"用过,没有任何libc.so或libm.so被打印出来 otool -L com_ex1.o 那么,这样做的原因是什么?我在使用Otool错误吗?或这些库不应以共享库出现? 解决方案 动态库链接到最终可执行文件,而不是 到对象文件,因此您应该运行(例如) otool -L com_ex1 这应该显示 之类的东西 com_ex1: /usr/lib/libSystem.B.dylib (compatibility vers
2 2023-11-08
编程技术问答社区
C语言程序中.bss段的模糊行为
我在下面写了简单的C程序(test.c): - #include int main() { return 0; } 并执行了follwing,以了解.bss段中的尺寸变化. gcc test.c -o test size test 输出以: - text data bss dec hex filename 1115 552 8 1675 68b test 我没有在全球或静态范围内声明任何内容.因此,请解释为什么BSS段的大小为8个字节. 我进行了以下更改: - #include int x; //declared global variable int main() { return 0; } 但令我惊讶的是,输出与以前相同: - text data bss dec hex
4 2023-09-04
编程技术问答社区
我如何使用objdump和bash函数在linux中找到共享对象文件中的函数?
我在Linux中有一个文件夹,其中包含几个共享对象文件(*.so).我如何使用objdump和linux中的bash函数在共享对象文件中找到函数? 例如,在mylib.so中找到me函数func1: objdump -d mylib.so | grep func1 ,但我想在包含共享对象文件的文件夹中找到func1.我不知道Bash语言以及如何组合Linux终端命令. 解决方案 nm对于此任务,它比objdump更简单. nm -A *.so | grep func应该起作用. -A标志告诉nm打印文件名. 其他解决方案 您也可以使用, find -name "*.so" -exec nm {} \; | grep func1
12 2023-08-31
编程技术问答社区
如何找出一个共享对象的哪些功能被程序或其他库使用?
我如何找到程序或其他库使用共享对象的哪些功能? 在这种特定情况下,我想看看其他动态库使用/lib/libgcc1_so.1中的哪些功能. 由于它们是动态链接的,因此OBJDUMP -D无法解析函数调用地址. 有没有办法在调试器中运行程序或静态重新链接? 谢谢, luca 编辑: nm和readelf不会做,我不需要查看共享对象中存在哪些符号,但实际上是在链接到它的其他对象中使用的. 解决方案 nm 只有在库未剥离其符号的情况下才能起作用.但是,nm -D可以向您显示一些信息: nm -D /lib/libgcc_s.so.1 但是还有另一个可以帮助您的工具: Readelf 阅读 - 显示有关 小精灵文件. ,如果您检查了男人页,选项 -s :Displays the entries in symbol table section of the file, if it has one. readelf -s /lib/libgcc_s
8 2023-08-31
编程技术问答社区
我怎样才能用objdump这样的东西来判断一个对象文件是否已经用-fPIC构建?
如果使用-fPIC>? 解决方案 答案取决于平台.在大多数平台上,如果输出 readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)' 是空的,然后foo.o未与-fPIC一起编译,或者foo.o不包含任何代码.-fPIC很重要. 其他解决方案 我只需要在PowerPC目标上执行此操作,以查找没有-FPIC的共享对象(.SO).我所做的是运行 readelf -d libmylib1.so 并寻找Textrel.如果您看到Textrel,则一个或多个构成您的.So的源文件不是由-FPIC构建的.如果需要 ,例如, [user@host lib]$ readelf -d libMyLib1.so | grep TEXT # Bad, not -fPIC 0x00000016 (TEXTREL) [user@host lib]$ readelf -d libMyLib2.so | grep TEXT #
6 2023-08-31
编程技术问答社区
了解 RiscV objdump
我正在检查我使用以下命令编译的C文件的objdump: riscv64-unknown-elf-gcc -O0 -o maxmul.o maxmul.c riscv64-unknown-elf-objdump -d maxmul.o > maxmul.dump 奇怪的是(或不)这些地址似乎不在32位单词上对齐,而是在16位边界上. 任何人都可以向我解释为什么? 谢谢. objdump摘录: 00000000000101da : 101da: 7155 addi sp,sp,-208 101dc: e586 sd ra,200(sp) 101de: e1a2 sd s0,192(sp) 101e0: 0980 addi s0,sp,208
90 2023-08-21
编程技术问答社区
我能否将 "Objdump -S -d elf-file "生成的所有部分合并为一个能够重新组装的文件?
小精灵文件是静态链接 目前,Objdump的输出类似于: Disassembly of section: .init: xxxxxx Disassembly of section: .plt: xxxxxx Disassembly of section: .text: xxxxxx 基本上我想实现的目标是 " elf-file-(由objdump拆卸) - >组装文件 - (重新编译) - > 相同的功能" 我不需要重新编译的二进制内容的二进制内容与原始内容相同,仅相同的功能就足够了. 快速搜索后,答案基本上是 no ,他们认为拆卸文件丢失了一些东西,例如 symbolic信息或erther,但我认为通过静态链接,我可以摆脱这个问题... 谢谢! 解决方案 objdump -S -d elf-file通常不够,因为它缺少.data ,但似乎objdump -S -D elf-file就足够了. 为了尝试此操作,我编写了
6 2023-08-11
编程技术问答社区