标签: elf

valgrind stacktrace中缺少符号

我正在使用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)

linker gcc valgrind elf debug-symbols

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

有经验的DWARF解析器/用户吗?需要获取DIE的属性类型偏移量

因此,我试图使用libdwarf解析程序的DWARF文件(为此,我必须坚持使用C),我试图从每个DIE专门获取DW_AT_type标记。其中大多数(我不确定是否全部)都是偏移量,我试图找到任何有用的函数来获取这些标记的值。

例:

<2> <286>
DW_AT_type <156>

我在这里想要的是该特定DIE的type属性的156偏移值。

你们知道API是否提供执行此功能的功能吗?

注意:我必须坚持使用C,所以请不要推荐任何python库或对dwarfdumped文件的解析。我只是在寻找一个特定的功能,但是在过去的几天里一直在尝试,并且在文档中找不到任何功能。

c debugging elf dwarf

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

我可以将"Objdump -S -d elf-file"生成的所有部分组合成一个具有重新组装功能的文件吗?

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反汇编) - >汇编文件 - (重新编译) - > 相同的功能 "

我不需要重新编译的二进制文件具有与原始二进制文件相同的二进制内容,只有相同的功能就足够了.

经过快速搜索,基本上答案是否定的,他们认为反汇编文件丢失了一些像符号信息或其他东西,但我认为通过静态链接,我可以摆脱这个问题......

谢谢!

assembly reverse-engineering elf objdump disassembly

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

ELF 或二进制文件中有特定 ABI 的签名吗?

我需要确定用于生成一些二进制文件、程序、动态和静态库的 ABI。

我想问一下是否有一个属性、一个标签或一个字符串,我可以用一些外部工具检查以查看哪个 ABI 用于创建该二进制对象。我的对象主要是用于 x86 和 ARM 的 ELF,我也包括用于调试目的的 ABI,例如 DWARF 对象。

编辑:类似于文件开头的魔术字节,通常用于检测文件的文件格式。

x86 arm elf abi

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

汇编程序何时更好地使用符号扩展重定位(如R_X86_64_32S)而不是像R_X86_64_32那样的零扩展?

作为一个具体的例子,在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

assembly x86-64 gnu-assembler nasm elf

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

如何在 Linux 上挂钩 send() / recv() 函数?

我正在尝试在 Linux 上用 C++挂钩recv()send()函数。

我知道如何挂钩函数 (github: zeek/subhook)。但是我想要一些帮助来学习如何查找recv()send()函数的地址(在运行时,或使用独立版本的解决方案)。

我愿意接受任何可以帮助我理解此处涉及的机制的文档或建议。


[编辑] 澄清:我不想使用,LD_PRELOAD=因为我用这个工具注入了我的共享库:linux-inject

c c++ unix elf abi

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

如何解码 ELF 中的节表?

我正在分析这个小小的 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)

linux elf low-level

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

ELF - 入口点地址在运行时更改

我在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)

c linux elf

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

试图在32位ELF中找到隐藏的字符串

别担心,我不会要求答案.

我试图在一个简单的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)

x86 assembly reverse-engineering elf

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

如何让编译器生成“elf32-x86-64”格式的目标文件?

首先,关于 elf32-x86-64 格式的一些背景信息。

它是一种利用 64 位硬件同时强制执行 32 位指针的格式。Ref1Ref2

我正在尝试将 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目标文件?

添加 1 - 3:29 PM …

gcc elf googletest

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