问题标签 [readelf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何获取 shstrtab 的字符串?
我正在编写 Linux 的 readelf 的简化版本。
我想打印部分信息,所以我需要部分的名称。在 Elf64_Shdr 结构中,sh_name 变量仅将我指向 shstrtab 中的索引。但这似乎不是 shstrtab 标头中的索引。它是其相关数据的索引。我想知道如何到达那里,因为 ELF 标头仅将我指向 shstrtab 部分标头,而不指向其相关数据。从我在文件的 hexdump 中可以看到,文件的结构如下:
我想错了吗?任何人都可以指导我获取部分名称吗?
linker - ELFIO 正在创建全零 ELF 部分,无论设置数据如何。如何将数据放入 .text 部分?
我正在尝试使用 ELFIO 创建一个 ELF 对象。
解决方法:线路section_text->set_flags(SHT_PROGBITS);
应该是section_text->set_type(SHT_PROGBITS);
生成的对象是错误的(如下所述),因此:
如何创建一个包含实际数据的 elf 部分?
该程序如下:
当我使用 .text 部分转储该部分时,该部分readelf
的大小和标志(AX,16 字节)是正确的,但数据全为零
readelf -x .text -aW sample.elf
输出:
十六进制转储是:
当预期是:
android - 使用 STABS 从共享库 (.SO) 中获取帧
我有一个带有 STABS 调试信息的 Android SO 库,而不是 DWARF。我想从中获取调用帧信息,类似于...-readelf --debug-dump=frames-interp
输出。
对于大多数 NDK 构建的库,readelf
可以做到这一点,但不是这个。
STABS 是否支持框架信息?如果是这样,什么样的可执行文件解析器可以把它弄出来?
Addr2line
该文件没有问题。
c++ - 在应用程序中集成共享对象,ldd 和 readelf 显示不同的输出
我正在尝试将 OpenCV 集成到应用程序中并面临以下一些问题。
但是,当我检查ldd和readelf的输出时,以下是差异。
如上所示,readelf输出中缺少libopencv_imgproc。有人可以指出导致这种行为的原因吗?
linux - 如何提取obj文件中的所有部分
我正在使用 X86_64 Ubuntu 机器。我知道我们可以使用该命令从 obj 文件中提取某些部分。
假设我有一个名为 obj 的文件main.o
,现在我可以执行以下操作:
然后我可以在命令的帮助下提取一些部分objdump
,例如,
正如我们所看到的,我在.data
此处提取了该部分。
但是,如果我尝试提取另一个部分,它似乎无法按预期工作。
为什么无法.strtab
提取部分?如何提取此部分?
c - 入口点地址和__executable_start有什么区别
我正在学习链接器如何在 Linux 上工作。有人告诉我,链接器将为可执行文件生成一些符号,例如__executable_start
,这是程序启动的地址。
另外,我知道 ELF 文件中有一个“入口点地址”。
所以我不知道他们之间有什么区别。
我在下面写了一个简单的代码:
我用 GCC 编译它并得到一个名为a.out
.
当我执行它时,它给了我Executable Start 4CEDA000
.
然后我执行命令readelf -h a.out
,关于入口点的输出是Entry point address: 0x540
嗯,很明显,0x540
而且4CEDA000
完全不同。
c++ - “ld:警告:找不到条目符号_start;默认为 0000000000401000”,带有自定义 *.o 文件
我编译了一个简单的目标文件文件并尝试与 链接ld
,但它给出了警告。但是,文件有_start
符号,这是readelf
对象的。
这里可能是什么问题
c++ - 为什么我的简单“主”程序的 ELF 标头说它是“DYN(共享对象文件)”而不是可执行文件?
这是一个非常简单的 C++ 程序:
我Makefile
生成以下命令来编译程序。
我用命令检查file
它是一个 ELF 可执行文件:
在我尝试检查 ELF 标头之前,一切似乎都很好:
从这里的维基百科,似乎有不同类型的文件,例如EXEC
. 为什么它说我的简单主程序是共享对象而不是 ELF 标头上的可执行文件?
从我对.so
's 的有限知识范围来看,我认为它们是链接但直到运行时才加载的库。在这种情况下,这有什么意义?
额外的信息:
c++ - 是否可以跳过/删除 ELF 文件中的“PHDR”程序头以执行可执行文件?如果是这样,为什么?
我正在对这个简单的 C++ 程序的二进制文件进行一些修改,以了解 ELF 的程序头:
编译:
我曾经readelf -l main
得到以下内容:
我在本文档中看到:http ://man7.org/linux/man-pages/man5/elf.5.html for PHDR:
数组元素(如果存在)指定程序头表本身在文件和程序内存映像中的位置和大小。这种段类型在一个文件中不能出现多次。此外,只有当程序头表是程序内存映像的一部分时,才会出现这种情况。如果它存在,它必须在任何可加载的段条目之前。
引用中的出现if present
让我想知道如果我跳过 PHDR 标题会发生什么。我使用vim的十六进制编辑器来更改使用的二进制布局main
(:%!xxd
一定要:%!xxd -r
在保存之前运行,否则它不再是二进制文件)从:
至:
(仅更改第 20 个字节),跳过 PHDR 标头的长度。我readelf
再次运行以验证它仍然是有效的 ELF 文件:
令人惊讶的是,该程序仍然执行得非常好。为什么我们甚至需要 PHDR 标头?它对链接和/或其他情况有用吗?似乎它在运行时根本没有使用,那么为什么我们会有这个?
linux - 为什么符号大小的总和远小于“.text”部分的大小?
我在 linux 中调试一个动态共享库,库的名字是libMNN.so
.
这是libMNN.so
got by所有部分的大小size -A ./libMNN.so
:
我们可以看到“.text”的大小是804416,“.rodata”的大小是17772。
这是命令获得的符号大小的总和readelf -D -sW ./libMNN.so | awk '{print $4}' | awk '{s+=$1} END {print s}'
:
符号大小的总和远小于“.text”和“.rodata”,为什么?
libMNN.so 可以从https://github.com/alibaba/MNN/releases/download/1.0.0/Android.zip下载