Articles of 精灵

为什么共享库的ELF标头指定Linux作为OSABI?

我的Linux系统上的所有标准共享库(Fedora 9)都将ELFOSABI_NONE(0)指定为它们的OSABI。 这很好 – 但是我收到了ELF头文件中给出的OSABI为ELFOSABI_LINUX(3)的共享库。 这对于一个用于Linux系统的共享库来说听起来并不合理,但是对于我的其他所有库来说这是一个不同的值 – 所以当我试图用dlopen()打开这个库时,我的其他库的这个失败,错误“ELF文件操作系统ABI无效”。 我编译了FreeBSD实用程序brandelf.c,并使用它将OSABItypes更改为0,现在该库似乎可以与其他所有程序一起使用。 我只是想知道 – 你为什么认为这个库被标记为ELFOSABI_LINUX? 我猜也许他们在另一个系统上交叉编译,并指定一些gcc标志,导致这个值被设置到ELF头? 我试图实现类似的东西,但无法确定适当的gcc标志或标志。 我想知道可能的原因是什么,因为这个特定的供应商不会做任何事情,没有很多的手,我想能够说“你可能在做X,但这意味着我们必须修改你的库我们接受了他们之后“。

ELF文件格式如何定义堆栈?

我正在学习ELF文件格式,所以我编译了一个小程序,从结果可执行文件中删除了部分头文件和它们的内容。 ELF标题包含入口点地址,它指向.text部分的开始。 我还发现包含静态数据的.data节和包含只读数据的.rodata …我希望有一个堆栈的部分,但我找不到该部分。 我也希望在某个时候,ESP被设置在某个部分的顶部,但是我在反汇编中找不到那样的东西。 那么ESP如何获得初始价值呢?

ELFdynamic加载器符号查找顺序

解决dynamic重定位时符号查找的search顺序是什么? 当parsing共享库的符号时,加载器首先在“主要可执行文件”中search(让主要可执行文件覆盖定义…)或者什么?

根据需要装载/卸载ELF部分?

对于一个比较模糊的用例,我希望有一个(大的)静态链接的Linux可执行文件,由一小块控制代码和大量的静态(只读)数据组成。 有没有可能为了节省内存,让加载程序只加载控制代码的部分,然后手动加载需要的RO数据部分,并在处理完成后再次卸载它们? 这可能吗? (我认为数据stream(在文件系统级别)可以用来解决这个问题,但是它们对我来说是不可用的(EXT3),因为数据stream很容易丢失,所以分发会很棘手。

在ELF二进制中导入名称

ELF格式在哪里存储导入函数的名称? 总是可以枚举所有的导入名称,比如PE可执行文件? 例如,如果一个二进制文件正在使用printf ,那么是否可以通过二进制本身的静态分析来告诉它呢?

ELF程序头虚拟地址和文件偏移量

我知道两者之间的关系: 虚拟地址mod页面alignment==文件偏移mod页面alignment 但有人能告诉我这两个数字在哪个方向计算吗? 根据上述关系计算文件偏移量的虚拟地址,反之亦然? 更新 这里有一些细节:当链接器写ELF文件头时,它设置程序头的虚拟地址和文件偏移量(段) 例如有readelf -l someELFfile的输出readelf -l someELFfile : Elf file type is EXEC (Executable file) Entry point 0x8048094 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x00154 0x00154 RE 0x1000 LOAD 0x000154 0x08049154 0x08049154 0x00004 0x00004 RW 0x1000 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW […]

我怎样才能用go1.6.2构buildlinux 32位版本

有没有GOARCH和GOOS值的组合,我可以设置为了构buildELF 32位二进制?

dladdr不会返回函数名称

我正在尝试使用dladdr。 它正确地定位库,但它没有find函数名称。 我可以调用objdump,做一个小math,并获得我通过dladdr函数的地址。 如果objdump可以看到它,为什么不能dladdr? 这是我的function: const char *FuncName(const void *pFunc) { Dl_info DlInfo; int nRet; // Lookup the name of the function given the function pointer if ((nRet = dladdr(pFunc, &DlInfo)) != 0) return DlInfo.dli_sname; return NULL; } 这是一个gdb成绩单,显示我得到的。 Program received signal SIGINT, Interrupt. [Switching to Thread 0xf7f4c6c0 (LWP 28365)] 0xffffe410 in __kernel_vsyscall () (gdb) […]

ELF文件TLS和LOAD程序部分

int i; int main() { return i; } readelf -l编译readelf -l显示来自elf的程序头文件: Elf file type is EXEC (Executable file) Entry point 0xxxxx30 There are 6 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x79868 0x79868 RE 0x1000 > LOAD 0x079f94 0x080c2f94 0x080c2f94 0x0078c 0x02254 […]

目标文件的objdump输出中的标志

在某个目标文件上有objdump的输出: $ objdump -h main.o main.o: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000000b 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00000000 00000000 00000040 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000040 2**2 ALLOC 3 .note.GNU-stack 00000000 00000000 00000000 00000040 […]