标签: elf

.text.unlikely 在 ELF 目标文件中意味着什么?

在我的objdump -t输出中,我看到以下两行:

00000000000004d2 l     F .text.unlikely 00000000000000ec function-signature-goes-here [clone .cold.427]
Run Code Online (Sandbox Code Playgroud)

00000000000018e0 g     F .text  0000000000000690 function-signature-goes-here
Run Code Online (Sandbox Code Playgroud)

我知道l意味着本地,也g意味着全球。我还知道这.text是目标文件中的一个部分或一种类型的部分,包含已编译的程序指令。但什么是.text.unlikely?假设它是一个不同的部分(或部分类型).text- 有什么区别?

symbols elf objdump object-files likely-unlikely

4
推荐指数
1
解决办法
1550
查看次数

跳过/删除 ELF 文件中的“PHDR”程序头可执行文件是否可以?如果是这样,为什么?

我正在对这个简单的 C++ 程序的二进制文件进行一些修改,以了解 ELF 的程序头:

\n\n
int main(){ }\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译为:

\n\n
\xe2\x9d\xaf make\ng++ -O0 -fverbose-asm -no-pie -o main main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n\n

我曾经readelf -l main得到以下信息:

\n\n
Elf file type is EXEC (Executable file)\nEntry point 0x401020\nThere are 11 program headers, starting at offset 64\n\nProgram Headers:\n  Type           Offset             VirtAddr           PhysAddr\n                 FileSiz            MemSiz              Flags  Align\n  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040\n                 0x0000000000000268 0x0000000000000268  R      0x8\n  INTERP         0x00000000000002a8 0x00000000004002a8 0x00000000004002a8\n                 0x000000000000001c 0x000000000000001c  R      0x1\n      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]\n  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000\n                 0x00000000000004c0 0x00000000000004c0  R …
Run Code Online (Sandbox Code Playgroud)

c c++ elf readelf

4
推荐指数
1
解决办法
1955
查看次数

区分ELF文件中的.shstrtab和.strtab

我想知道解析 ELF 文件时.shstrtab与 a 相比如何识别a ?.strtab从阅读elf(5) - Linux 手册页来看,两者都是节标题类型SHT_STRTAB,那么我如何知道我遇到的是其中之一呢?

他们的描述是:

.shstrtab
    This section holds section names.  This section is of type
    SHT_STRTAB.  No attribute types are used.
Run Code Online (Sandbox Code Playgroud)
.strtab
    This section holds strings, most commonly the strings that
    represent the names associated with symbol table entries.  If
    the file has a loadable segment that includes the symbol
    string table, the section's attributes will include the
    SHF_ALLOC bit.  Otherwise, the bit will be off. …
Run Code Online (Sandbox Code Playgroud)

linux elf string-table

4
推荐指数
1
解决办法
5429
查看次数

在IAR ARM V8编译器中更改DWARF elf格式

在我们的开发中,我们从IAR ARM V7.40切换到IAR ARM V8.40

我们使用 python 包pyelftools对调试信息进行后处理。不幸的是,现在这似乎被打破了,因为 V8 编译器似乎使用 DWARF4 语法,而 pyelftools 并未完全涵盖该语法。V7 编译器使用 DWARF3,这很好。

IAR V8 是否有任何编译器选项可以更改 DWARF 格式?在IAR C/C++开发指南中,我只找到了--debug, -r启用调试信息的选项,但没有进一步的微调(例如-gdwarf-3arm-clang编译器的选项)。

c elf dwarf iar

4
推荐指数
1
解决办法
889
查看次数

为什么在x86 Linux中为elf可执行文件加载对齐地址的函数?

我一直在寻找x86上的Linux elf可执行文件,主要使用IDA但也使用gdb.我注意到的一件事是函数总是在字对齐的地址加载?谁知道原因?我不知道x86指令是否需要从对齐的地址开始.并且它不能归因于页面对齐导致页面边界仍然可以在函数内的任何位置.

我会很感激任何见解.

谢谢.

linux loading elf

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

创建ELF而不是a.out

我需要使用gcc生成一个简单的"Hello World"ELF32可执行文件.我似乎没有gcc-elf命令.是否可以在不重新构建gcc的情况下创建ELF二进制文件而不是a.out?

(我假设应该可以选择一些选项,但我不确定如何继续)

c gcc elf

3
推荐指数
2
解决办法
2091
查看次数

内存中的哪些部分是可写的?

我正在运行一些C代码,在Linux上编译为32位x86.而我正试图访问一些内存.显然我可以写入.bss.data堆栈.前段时间,.ctors和.dtors段曾经是可写的,但似乎它们已经消失了.

如果没有反复试验,我怎样才能找到内存中哪些部分被映射?如何找出哪些地址映射到可写内存以及哪些地址是可执行的?

c linux elf

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

如何以改变文件部分数据长度的方式修改ELF文件?

我正在尝试修改自己的ELF文件的可执行内容,以查看是否可行。我编写了一个程序,该程序读取和解析ELF文件,搜索应更新的代码,对其进行更改,然后在更新节标题中的sh_size字段后将其写回。

但是,这不起作用。如果我只是简单地交换一些字节和其他字节,它就可以工作。但是,如果更改大小,它将失败。我知道有些sh_offsets彼此紧邻。但是,当我减小可执行代码的大小时,这无关紧要。

当然,我的程序中可能存在一个错误(或多个),但是我已经很努力地进行了研究。

除了寻求调试程序方面的帮助外,我只是想知道,除了sh_size字段之外,还有什么要更新才能使它起作用的(减小大小时)?除了该字段之外,还有什么会使长度更改失败的事情吗?

编辑:

看来安迪·罗斯(Andy Ross)完全正确。即使在这个非常简单的程序中,我也遇到了__libc_start_main中的一些间接寻址,我不能轻易修改这些间接寻址来更新它将达到的偏移量。

不过,我很好奇,什么是仍然设法尽可能解决这个问题的最佳方法?我知道我无法在所有情况下都解决此问题,但是对于某些简单程序,应该可以更新使其运行所需的内容?我应该尝试编写自己的虚拟机还是尝试开发一个“调试器”以将每个可疑问题指令替换为INT 3?有任何想法吗?

linux elf

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

将ELF共享库和自定义binfmt可执行文件加载到相同的Linux地址空间中

我正在开发一个项目来加载和运行Linux平台上的自定义二进制格式可执行文件(在我的例子中是PE).到目前为止,我已经成功地完成了这项工作,首先加载可执行文件,然后加载一个调用可执行文件起始地址然后安全退出的小型ELF共享库.

不过,出于某些原因,我真的不想自己装ELF.首先,我使用的共享库是用汇编编写的(我不能使用任何其他东西,因为我没有链接libc等等),这将是非常特定于平台的,我想放弃它和使用C所以我可以编译任何平台.此外,使用Linux的本机ELF加载程序而不是我自己的简化版本将更容易,更安全.

我想知道是否有办法使用我的binfmt处理程序,一个已安装的内核模块来加载我的可执行文件,然后让Linux将我的共享库(及其依赖项)加载到同一地址空间而不覆盖我的可执行代码.我首先想到uselib系统调用可能有用,但是手册页上的描述不清楚这是否符合我的目的:

从libc 4.4.4开始,只加载了库"/lib/ld.so",这样这个动态库就可以加载所需的剩余库(再次使用这个调用).这也是libc5中的事态.

glibc2不使用此调用.

我也从未见过它的使用示例,我总是担心使用我不理解的系统调用.

有没有一个很好的方法来实现我所描述的?我是否可以使用Linux的现有功能将共享库(用C编写)加载到已包含可执行代码的地址空间中,如果是这样,我如何使用该库而不知道它已被加载到何处?

linux memory-management process shared-libraries elf

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

如何通过pyelftools保存修改后的ELF

最近我对ELF文件结构感兴趣.在网上搜索,我找到了一个名为pyelftools的精彩脚本.但实际上我不知道保存修改过的ELF的方法; ELFFile类没有任何方法可做.

首先,我确实喜欢以下内容:

            header = self.elf.header
            self._emitline("%s" % header['e_shnum'])
            header['e_shnum'] = 30
            self._emitline("%s" % header['e_shnum'])
Run Code Online (Sandbox Code Playgroud)

是的,那是不好的方式.但遗憾的是我不知道在ELF文件中获得e_shnum的偏移量.有人能教我吗?

问候,

雷克斯.

python elf

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