标签: elf

合并 2 个或更多 ELF 文件的最简单方法

我正在为一个类项目编写一些嵌入式代码,该项目当前(根据要求)创建了许多 srec 文件并合并它们。我希望能够将此代码加载到 QEMU 中,但它通常只对 ELF 文件满意。合并原始 ELF 文件而不是 srecs 的最有效方法是什么?同样可以接受的是,将 srec 转换回 ELF 并使生成的文件可加载的方法(objcopy 这样做似乎会产生相当损坏的文件(其他架构中没有架构)。这些工具必须能够使用 m68k 二进制文件,但是主机系统是普通的 x86。

embedded linker 68000 elf coldfire

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

为什么 elf 段没有页面对齐?

readelf -l /bin/ls:

  LOAD           0x000000 0x08048000 0x08048000 0x18ff8 0x18ff8 R E 0x1000
  LOAD           0x019eec 0x08061eec 0x08061eec 0x003f4 0x01014 RW  0x1000
Run Code Online (Sandbox Code Playgroud)

那么两个段之间的边界页既是只读的又是可读写的,这怎么可能呢?

elf

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

如何从 elf 文件格式创建可执行十六进制

我对此非常陌生,我有 elf 文件input.out,需要从中创建十六进制可执行文件。我正在使用 objcopy 创建 intel 十六进制格式的可执行文件,如下所示

objcopy -O ihex input.out out.hex
Run Code Online (Sandbox Code Playgroud)

通过这个 out.hex 包含来自所有部分(.interp、.note.ABI-tag 等)的数据,但我不确定可执行文件是否需要所有这些数据。.text 部分足以创建可执行的十六进制,所以我可以按如下方式使用,还是需要更多部分

objcopy -j.text -O ihex input.out out.hex
Run Code Online (Sandbox Code Playgroud)

另外,如果有任何好的参考来详细了解这一点,我无法通过 Goggling 找到太多内容。可能我不知道要搜索什么。

linux gcc elf icc objcopy

7
推荐指数
1
解决办法
3万
查看次数

如何从 ELF 文件中获取源代码路径 && 文件名(与 -g 编译)?

我想通过ELF文件获取源代码路径&&源名称,.debug_str部分包含我需要的内容,但如何过滤掉它们?

linux elf

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

在ELF中查找函数的起始偏移量

假设我fn.textELF64可执行文件的某个部分中有某个功能.有没有办法知道fn函数所在的ELF文件的起始位置(以字节为单位)?请注意,我不需要知道它在链接时重定位的VA,而是它在ELF文件中的位置.

executable function elf relocation disassembly

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

查找 PLT 存根的地址

我正在 Linux X86_64 上工作。

我需要根据条目所代表的动态函数的名称来确定 ELF 文件中特定 PLT 条目的地址。我可以算出文件相对于地址的偏移量,但我需要能够确定地址。

如果我使用反汇编 ELF 文件,objdump -D -z elffile我会发现 objdump 对 PLT 中的每个条目使用符号名称。(objdump从哪里获取这些地址和符号名的关系?)

例子:

0000000000000041a2b0 fileno@plt:
Run Code Online (Sandbox Code Playgroud)

如果我使用objdump -T elffile | grep fileno我会得到这样的东西:

0000000000000   DF *UND*  00000000000000000   GLIBC_2.2.5 fileno
Run Code Online (Sandbox Code Playgroud)

我需要从“C”做的是在 ELF 文件中找到特定动态函数的 PLT 条目并获取地址。

背景是我正在修补现有的 ELF 文件,并且需要将函数调用重定向到不同的动态函数。我已经使用从 objdump 反汇编中收集的地址手动修补了 ELF 文件,并证明这适用于我的特定应用程序,我只需要能够从程序中执行此操作。我希望不必通过 objdump 反汇编程序代码来找出它如何获取 PLT 条目符号和地址。

linux x86-64 elf plt got

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

elf 文件中的“.debug_info”部分是什么?

我有一个 elf 文件,在使用 elfparser 分析映射文件和 elf 时,我看到一个名为 .Debug_info 的部分,它占用了最大的内存。

我正在使用 xt-xc++ 为 xtensa DSP 进行编译,我还没有使用 -g 选项,也没有使用 -o2 优化级别。

在此输入图像描述

是否可以在发布版本中删除它?

c++ elf map-files

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

共享库符号冲突和静态链接(在 Linux 上)

我遇到了一个问题,该问题已在一篇好文章“共享库符号冲突(在 Linux 上)”中详细阐述。问题是,当执行和.so定义了同名函数时,如果.so调用这个函数名,它会调用执行中的那个函数,而不是.so本身的这个函数。

我们来谈谈这篇文章中的案例。我了解DoLayer()中的函数在编译时layer.o具有外部函数依赖性。DoThing()layer.o

但是在编译时libconflict.so,外部函数依赖项不应该就地解析并用conflict.o/DoThing()静态地址替换吗?

为什么layer.o/DoLayer()仍然使用动态链接来查找DoThing()?这是设计好的行为吗?

linux gcc elf dynamic-linking ld

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

有关 .init_array 函数参数的任何文档吗?

我可以看到很多复制的知识,这些函数在 .init_array 部分注册的函数具有命令行参数 argc 和 argv,如 main(),但我无法在网上找到任何实际发布的文档来证实情况确实如此。

\n

是的,为了清楚起见,函数本身没有在 .init_array 中“声明”,但在那里声明了指向该函数的指针,“注册”该函数,并在启动期间由某个迭代器调用。问题仍然是:向我显示该迭代器传入的参数列表的一些文档。

\n

我的目的是以一种微妙但通常安全的方式从动态库中更改这些参数,因此我想在内存中找到“真正的交易”——而不是从 /proc/self/ 中。

\n

欲了解更多信息,请点击下面的链接。

\n

一些堆栈溢出知识:在 Linux 上访问 main 之外的主要参数

\n

即使是我最喜欢的 Oracle ( docs.oracle.com/cd/E23824_01/html/819-0690/chapter3-8.html ) 也只提到函数被调用,但没有承诺可能有什么参数。据我所知,与 elf 和 gcc 文档相同。

\n

在 C/C++ UB 偏执狂的土地上,理想情况下,在我继续之前,我需要确定这是已记录的行为?它存在吗?可以通过某种方式暗示吗?

\n
\n

迄今为止的评论/答案摘要:

\n

至少对于 GNU libc,此补丁发生了相关更改:BZ #974。\n https://sourceware.org/pipermail/libc-alpha/2005-July/019240.html(在 glibc\'s 中提到) ChangeLog.old/ChangeLog.16 条目 2005-04-13 HJ Lu.) \xe2\x80\x93\nIan Abbott

\n

对我来说,这表明 glbc 维护者意识到传递 argc/argv/env 的要求 - 这不是偶然的 - 并将其扩展到主 exe 注册。它还告诉我们,它在该日期之前适用于动态库。

\n

这是一个有趣的问题,这是否会约束其他 libc 实现者遵循该模式。

\n

c gcc elf

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

谁执行运行时重定位?

我试图更好地理解 Linux 中的运行时重定位,特别是谁在不同情况下执行它们。以下是我目前的理解,是否准确?

  • 位置相关的静态链接可执行文件 - 无需运行时重定位
  • 动态链接的可执行文件 - 动态链接器 ( ld.so) 加载库,然后执行重定位
  • 静态链接 PIE - libc 启动代码执行重定位
  • 动态链接器本身 -ld.so是一个自重定位的二进制文件

谢谢

linux elf relocation dynamic-linking

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

标签 统计

elf ×10

linux ×5

gcc ×3

dynamic-linking ×2

relocation ×2

68000 ×1

c ×1

c++ ×1

coldfire ×1

disassembly ×1

embedded ×1

executable ×1

function ×1

got ×1

icc ×1

ld ×1

linker ×1

map-files ×1

objcopy ×1

plt ×1

x86-64 ×1