我正在使用valgrind来调试通过dlopen使用可加载库的二进制文件.在debian stable上,stacktrace不包含可加载lib内调用的符号.
| | ->11.55% (114,688B) 0x769492C: ???
| | | ->11.55% (114,688B) 0x7697289: ???
| | | ->11.55% (114,688B) 0x769806F: ???
| | | ->11.55% (114,688B) 0x419812: myfunc (main.c:1010)
Run Code Online (Sandbox Code Playgroud)
关于debian unstable的Valgrind工作正常,符号得到妥善解决.所以我开始寻找与众不同的东西.我在两个系统上都有这些软件包(valgrind从unstable更新为3.7):
ii valgrind 1:3.7.0-1+b1
ii libtool 2.2.6b-2
ii gcc 4:4.4.5-1
ii binutils 2.20.1-16
Run Code Online (Sandbox Code Playgroud)
libs不会被剥离并包含debuginfo:
ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x33ffd210859178c15bb3923c5491e1a1b6065015, not stripped
Run Code Online (Sandbox Code Playgroud)
仔细观察我注意到库的大小不同,在debian不稳定的情况下,lib稍微大些.将它们与readelf进行比较,调试信息的大小更大.
[26] .debug_aranges PROGBITS 0000000000000000 00a74c 000090 00 0 0 1
[27] .debug_pubnames PROGBITS 0000000000000000 00a7dc 000385 00 0 0 1 …Run Code Online (Sandbox Code Playgroud) 因此,我试图使用libdwarf解析程序的DWARF文件(为此,我必须坚持使用C),我试图从每个DIE专门获取DW_AT_type标记。其中大多数(我不确定是否全部)都是偏移量,我试图找到任何有用的函数来获取这些标记的值。
例:
<2> <286>
DW_AT_type <156>
我在这里想要的是该特定DIE的type属性的156偏移值。
你们知道API是否提供执行此功能的功能吗?
注意:我必须坚持使用C,所以请不要推荐任何python库或对dwarfdumped文件的解析。我只是在寻找一个特定的功能,但是在过去的几天里一直在尝试,并且在文档中找不到任何功能。
elf文件是静态链接的
目前objdump的输出是这样的:
Disassembly of section: .init:
xxxxxx
Disassembly of section: .plt:
xxxxxx
Disassembly of section: .text:
xxxxxx
Run Code Online (Sandbox Code Playgroud)
基本上我想要实现的是
"elf-file - (通过objdump反汇编) - >汇编文件 - (重新编译) - > 相同的功能 "
我不需要重新编译的二进制文件具有与原始二进制文件相同的二进制内容,只有相同的功能就足够了.
经过快速搜索,基本上答案是否定的,他们认为反汇编文件丢失了一些像符号信息或其他东西,但我认为通过静态链接,我可以摆脱这个问题......
谢谢!
我需要确定用于生成一些二进制文件、程序、动态和静态库的 ABI。
我想问一下是否有一个属性、一个标签或一个字符串,我可以用一些外部工具检查以查看哪个 ABI 用于创建该二进制对象。我的对象主要是用于 x86 和 ARM 的 ELF,我也包括用于调试目的的 ABI,例如 DWARF 对象。
编辑:类似于文件开头的魔术字节,通常用于检测文件的文件格式。
作为一个具体的例子,在GAS 2.24上移动地址:
mov $s, %eax
s:
Run Code Online (Sandbox Code Playgroud)
后:
as --64 -o a.o a.S
objdump -Sr a.o
Run Code Online (Sandbox Code Playgroud)
使用零扩展:
0000000000000000 <s-0x5>:
0: b8 00 00 00 00 mov $0x0,%eax
1: R_X86_64_32 .text+0x5
Run Code Online (Sandbox Code Playgroud)
但内存访问:
mov s, %eax
s:
Run Code Online (Sandbox Code Playgroud)
编译以签署扩展名:
0000000000000000 <s-0x7>:
0: 8b 04 25 00 00 00 00 mov 0x0,%eax
3: R_X86_64_32S .text+0x7
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,或者一般情况下,是否有理由使用?我不明白汇编程序如何能够对任何一种情况做出更好的假设.
NASM 2.10.09仅R_X86_64_32用于上述两种情况.更新:在2.11之后的一个边缘nasm commit 6377180产生相同的Gas输出,这看起来像Ross提到的一个bug.
我已经解释了我认为我理解的内容R_X86_64_32S:https://stackoverflow.com/a/33289761/895245
我正在尝试在 Linux 上用 C++挂钩recv()和send()函数。
我知道如何挂钩函数 (github: zeek/subhook)。但是我想要一些帮助来学习如何查找recv()或send()函数的地址(在运行时,或使用独立于版本的解决方案)。
我愿意接受任何可以帮助我理解此处涉及的机制的文档或建议。
[编辑] 澄清:我不想使用,LD_PRELOAD=因为我用这个工具注入了我的共享库:linux-inject。
我正在分析这个小小的 ELF 文件:
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 3e 00 01 00 00 00 78 00 40 00 00 00 00 00 |..>.....x.@.....|
00000020 40 00 00 00 00 00 00 00 98 00 00 00 00 00 00 00 |@...............|
00000030 00 00 00 00 40 00 38 00 01 00 40 00 03 00 02 00 |....@.8...@.....|
00000040 01 00 00 00 …Run Code Online (Sandbox Code Playgroud) 我在debian 虚拟机(主机是 mac osx)中编译了一个简单的 c 程序,入口点“_start”是这样的:
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x580
Start of program headers: 64 (bytes into file)
Start of section headers: 6808 (bytes into file)
Flags: 0x0
Size …Run Code Online (Sandbox Code Playgroud) 别担心,我不会要求答案.
我试图在一个简单的1函数32位exe中找到一个隐藏的字符串(可能是一封电子邮件?)
我已经在文件上运行了字符串,没有用.
我已经将文件反编译为ASCII并找到了主要功能.
文件显示它是GCC可执行文件.
这是主要功能的asm:
; ================ B E G I N N I N G O F P R O C E D U R E ================
; Variables:
; arg_0: int, 4
main:
080489cc lea ecx, dword [esp+arg_0] ; Begin of unwind block (FDE at 0x80d6cb8), DATA XREF=_start+23
080489d0 and esp, 0xfffffff0
080489d3 push dword [ecx-4]
080489d6 push ebp
080489d7 mov ebp, esp
080489d9 push esi
080489da push ebx
080489db push ecx
080489dc sub esp, 0x2c
080489df …Run Code Online (Sandbox Code Playgroud) 它是一种利用 64 位硬件同时强制执行 32 位指针的格式。Ref1和Ref2。
我正在尝试将 Google Test 框架二进制文件链接到我的项目。
我objdump -f用来检查 Google Test 二进制文件和我的二进制文件的格式。
谷歌测试格式是elf64-x86-64. 我的elf32-x86-64。所以它们不能连接在一起。
然后我将以下内容添加到谷歌测试的 internal_utils.cmake 文件中:
set(ZEPHYR_LINK_FLAGS "-Wl,--oformat=elf32-x86-64")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${ZEPHYR_LINK_FLAGS}")
Run Code Online (Sandbox Code Playgroud)
我希望链接器标志可以将输出格式更改为elf32-x86-64.
但是谷歌测试构建失败,错误如下:
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.so: error adding symbols: File in wrong format
Run Code Online (Sandbox Code Playgroud)
该/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.so也是一种elf64-x86-64格式。
我检查了生成的目标文件,例如:
./googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
它仍然 是elf64-x86-64。
所以看起来链接器标志不影响目标文件格式。
我记得链接器ld会根据它第一个遇到的目标文件来选择输出格式。所以我想我需要告诉编译器输出elf32-x86-64格式。
如何要求编译器输出elf32-x86-64目标文件?