Articles of elf

ARM上TLS的代码序列

线程本地存储文档的ELF处理为各种体系结构提供了各种模型(本地执行/初始执行/通用dynamic)的汇编序列。 但不是ARM – 有没有我能看到这样的ARM代码序列的地方? 我正在编译器,并希望生成代码将与平台链接器(包括程序和dynamic)正常运行。 为了清楚起见,我们假设一个ARMv7 CPU和一个相当新的内核和glibc(比如说3.13+ / 2.19+),但是如果这很容易解释的话,我也会对旧的硬件/软件有什么改变感兴趣。

将静态链接的elf二进制转换为dynamic链接

我有一个静态链接到libc的精灵二进制文件。 我没有访问其C代码。 我想使用OpenOnload库,它在用户空间中实现了套接字,因此与标准的libc版本相比,提供了更低的延迟。 OpenOnload实现标准套接字api,并使用LD_PRELOAD覆盖libc版本。 但是,由于这个elf二进制是静态链接的,所以它不能使用套接字API的OpenOnload版本。 我相信,转换这个二进制dynamic链接与OpenOnload是可能的,采取以下步骤: 添加新的程序标题:PT_INTERP,PT_DYNAMIC和PT_LOAD。 在PT_DYNAMIC中添加条目以使用libc列出依赖关系。 在新的PT_LOAD部分中为所需的libc函数添加PLT存根。 修改libc函数的现有二进制代码以跳转到相应的PLT存根。 作为第一个剪辑,我尝试添加3个PT_LOAD段。 在现有的PT_LOAD段标题之后添加了新的段标题。 此外,现有段的vm_addr未被修改。 根据p_align将现有段的文件偏移量转移到下一个alignment的地址。 新的PT_LOAD段被添加到文件末尾的文件中。 在重新写入文件之后,当我运行它时,它已经被内核正确加载了,但是它立即被分割了。 我的问题是: 如果我只是移动精灵二进制文件偏移量,而不修改vm_addresses,它可以导致运行二进制文件时出现任何错误? 是否有可能做我正在尝试的? 有人试图吗?

程序加载/执行

我是编译器的初学者,但是我非常有兴趣了解一个程序是如何构造的(二进制)以及如何读取和加载到内存中执行。 你们build议我阅读哪些电子书/书籍/教程以便快速入门?

a.out被ELF文件格式取代?

我有几个问题: 为什么a.out被ELF取代? a.out格式中导致ELF文件格式升级的主要缺陷是什么? 较早的核心转储基于a.out,但是现在它们基于ELF。 ELF提供的各种优势是什么?

将代码/符号修补为dynamic链接的ELF二进制文件

假设我有一个dynamic链接的ELF二进制文件,我想覆盖/redirect某些库调用。 我知道我可以用LD_PRELOAD来做到这一点,但是我想要一个在二进制文件中永久存在的独立于环境的解决scheme,它可以用于setuid / setgid二进制文件,其中没有一个是LD_PRELOAD可以实现的。 我想要做的就是从其他目标文件中添加代码(如有必要,可能在新的部分添加代码),并将这些目标文件中的符号添加到二进制文件的符号表中,这样就可以使用新添加的代码版本代替共享库代码。 我相信这应该是可能的,而不需要在现有的代码中进行实际的迁移。 即使它们在同一个文件中,它们应该能够在运行时以通常的PLT方式来parsing(因为我只关心函数,而不关心数据)。 请不要给我答复,“你不想这样做!” 或者“那不是便携的!” 我正在处理的是一种连接二进制文件与ABI不兼容的备用共享库实现的方式。 有问题的平台是i386-linux(即32位)。 除非我误解了什么是可能的,否则我可以编写一些工具来parsingELF文件并执行我的黑客攻击,但我怀疑有一种奇怪的方式来使用GNU链接器和其他工具来完成此操作,而无需编写新代码。

执行init和fini

我刚刚读了ELF文件中的init和fini部分 ,并试了一下: #include <stdio.h> int main(){ puts("main"); return 0; } void init(){ puts("init"); } void fini(){ puts("fini"); } 如果我执行gcc -Wl,-init,init -Wl,-fini,fini foo.c并运行结果,则不会打印“init”部分: $ ./a.out main fini init部分没有运行,还是无法打印? 有没有关于init / fini的任何“官方”文档? man ld说: -init=name When creating an ELF executable or shared object, call NAME when the executable or shared object is loaded, by setting DT_INIT to […]

每个cpu arch真正的ELF TLS ABI要求是什么?

Ulrich Drepper关于线程本地存储的论文概述了几种不同cpu体系结构的TLS ABI,但是我发现它不足以作为实现TLS的基础,原因有两个: 它省略了一些重要的拱形,如ARM,MIPS等(包括一堆完全无关的Itanium) 更重要的是,它将大量的实现细节与ABI混合在一起,所以很难说出哪些属性是互操作性所必需的,哪些是他实现的方面。 例如,i386的唯一实际ABI要求是: %gs:0指向自己的指针。 主要可执行文件的TLS段(如果有)必须位于固定的(通过链接器,负数)偏移量的地址。 初始加载的库的所有其他TLS段必须具有相对于此地址的运行时常量(即对于每个线程都是相同的,但在不同的程序运行中不一定是相同的)偏移量(并且dynamic链接程序必须能够填充重定位这些抵消)。 ___tls_get_addr和__tls_get_addr函数必须以正确的语义存在以查找任意TLS段。 特别是数字电视的存在或布局不是 ABI的一部分,也不是主节目以外的TLS部分的sorting/布局。 看起来,使用“TLS变体II”的任何拱都具有大致上述的ABI要求。 但我完全不了解“TLS变体I”的要求,而且从阅读来源(在uClibc和glibc中)看来甚至可能有几个变体“变体I”。 有没有更好的文件可以帮助我,或者熟悉TLS的人可以向我解释ABI的要求吗?

什么是__gmon_start__符号?

我用gcc hello.c编译这段代码-o hello -O3 #include <stdio.h> int main(void) { printf("Hello world\n"); return 0; } 当我列出重新分配我得到: test@southpark$ readelf -r hello | grep gmon 080495a4 00000106 R_386_GLOB_DAT 00000000 __gmon_start__ 080495b4 00000107 R_386_JUMP_SLOT 00000000 __gmon_start__ 当我列出这个文件中的符号时,我得到: test@southpark$ readelf -s hello | grep gmon 1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 48: 00000000 0 NOTYPE WEAK DEFAULT UND […]

为什么编译器版本出现在我的ELF可执行文件中?

我最近使用gcc在Debian Linux下编译了一个简单的hello world C程序: gcc -mtune=native -march=native -m32 -s -Wunused -O2 -o hello hello.c 文件大小是2980字节。 我在一个hex编辑器中打开它,我看到以下几行: GCC: (Debian 4.4.5-8) 4.4.5 GCC: (Debian 4.4.5-10) 4.4.5 .shstrtab .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .text .fini .rodata .eh_frame .ctors .dtors .jcr .dynamic .got .got.plt data.data .bss .comment 他们真的需要吗? 没办法减less可执行文件的大小?

int main(){return(0);}上的浮点exception(SIGFPE) }”

我正在尝试为两个不同的Linux环境构build一个简单的C程序。 在一个设备上,程序运行良好,在另一个设备上程序产生一个浮点exception。 该程序什么都不做,但从主返回0,这使我相信有一些不符合启动代码或ABI? 该程序是与海湾合作委员会与以下build设规范编译: 使用内置的规格。 目标:i386-redhat-linuxconfiguration:../configure –prefix = / usr –mandir = / usr / share / man –infodir = / usr / share / info –enable-shared –enable-threads = posix –enable-checking = release –with-system-zlib –enable -__ cxa_atexit –disable-libunwind-exceptions –enable-libgcj-multifile –enable-languages = c,c ++,objc,obj-c ++ ,java,fortran,ada –enable-java-awt = gtk –disable -dssi –disable-plugin –with-java -home = / […]