Tag: elf

如何使用ld脚本在elf目标中设置set入口点

我想使用链接描述文件指定我的ELF文件的入口点。 我已经在我的ELF中定义了一些部分,所以想要设置一个入口点。 谁能告诉我怎么做?

apcs-gnu ABI中的结构布局

对于此代码 : struct S { unsigned char ch[2]; }; int main(void) { _Static_assert( sizeof(struct S) == 2, “size was not 2”); } 使用带有ABI apcs-gnu (又名OABI或EABI版本0)的ARM的GCC(各种版本),我得到断言失败。 事实certificate结构的大小是4 。 我可以通过使用__attribute__((packed))解决这个问题; 但我的问题是: 使这个结构大小为4的理由是什么? 是否有任何文档指定此ABI中结构的布局? 在ARM网站上,我找到了aapcs (EABI第5版)的文档,它确实将此结构指定为大小为2; 但我找不到关于apcs-gnu任何信息。

如何减少ELF部分填充?

我使用crosstool-NG创建了一个带有gcc 6.3.0和glibc 2.25的PowerPC工具链。 我有以下测试程序test.c: int main() { return 0; } 我用命令编译它: powerpc-unknown-linux-gnu-gcc -s -Os -o test test.c 最后的二进制文件是66904字节,比预期的要大得多。 节标题如下所示: $ powerpc-unknown-linux-gnu-readelf -S test There are 27 section headers, starting at offset 0x10120: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 […]

ELF的代理共享库(sharedlib,shlib,so)?

在Windows上,创建“代理DLL”或多或少是常见的,代替原始DLL并将调用转发给它(在需要时执行任何其他操作之后)。 你可以在这里和这里阅读它。 然而,Linux下的shlib munging文化是完全不同的。 首先,LD_PRELOAD是Linux下ld.so的内置function,它只是将单独的shlib注入进程并使用它定义为覆盖的任何符号。 而这种“注入”技术似乎定义了整个思维方向 – 这是一个典型的ELF黑客工具或这个问题 ,绅士似乎与我有相同的用法,但首先要问他如何修补现有的二进制文件。 不用了,谢谢。 我不想注入或修改那些也不是我的东西。 我想做的就是创建一个独立的代理shlib,它将调用原始代理。 理想情况下,会有一个工具可以使用原始.so创建一个C源代码,它只会重定向到原始的函数,同时让我轻松覆盖我想要的任何东西。 那么,这样的工具在哪里? ;-) 谢谢。

在objdump的输出中,2 ** 2和2 ** 0的“Algn”是什么意思?

这在下面的文件中意味着什么? 2**2和2**0 $ 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 […]

链接到库时,__start_section和__stop_section符号丢失

我在类似于这个线程的autotools C项目中使用自定义elf头: 如何在C(gcc)中获得自定义ELF部分的起始和结束地址? 。 问题是声明自定义部分的c文件链接到静态库,然后链接到最终应用程序。 在此配置中,不会生成符号__start_custom_section和__stop_custom_section。 我像这样定义精灵部分: struct mystruct __attribute((__section__(“custom_section”))) __attribute((__used__) = { … }; 如果我链接到目标文件而不是库,则会创建符号,并且所有内容都按预期工作。 这不是一个可扩展的解决方案,因为我希望通过将新模块编译到模块库中来实现新模块。 知道为什么链接器在库中存在部分与单个目标文件时不会创建这些特殊符号?

在执行期间访问.eh_frame数据

我正在尝试从其中访问正在运行的程序的.eh_frame部分的内容(具体来说,该程序是Linux内核2.6.34.8)。 .eh_frame包含用于exception处理的有用数据,我想在内核代码内部使用它。 该部分已由gcc编写( readelf -a vmlinux.o包含.eh_frame ),问题是从代码中读取它。 我很确定精灵格式的文档说在代码执行期间可以访问.eh_frame 。 我查看了glibc的源代码,以寻找.eh_frame用法,并在sysdeps/generic/sysdep.h找到了大多数CFA指令的宏,但没有找到加载.eh_frame数据的实际代码。 是否需要修改加载内核以从文件加载数据的过程,或者.eh_frame info / .eh_frame_hdr段指针存储在某处作为宏/汇编程序名称(因此可以将其提取到C变量中)?

“。”在.symtab部分的Ndx列中的含义是什么?

add2.c: int counter=0; int a=0; int b; int c; int add(int a, int b) { return a+b; } 编译:gcc -c add2.c -o add2.o 阅读符号表:readelf –symbols add2.o Symbol table ‘.symtab’ contains 12 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS add2.c […]

编辑ELF文件中的变量值?

我需要在已编译的ELF文件中更改几个变量。 试图清楚地解释这一点,我将使用一个简单的C结构作为例子。 单个源文件从MyFile.c编译并链接(@ 0x1000)到MyFile.elf: typedef struct { uint32_t SerialNumber; /* Increments for every time it’s programmed */ uint32_t PartNumber; /* Always the same */ char ProdDateTime[32]; /* “YYYY-MM-DD HH:MM:SS” date/time when programmed */ uint32_t CalcCrc32; /* Checksum of the above data */ } MyData_T; const MyData_T MyData = { /* SerialNumber */ 0x11111111, /* PartNumber […]

如何知道ELF目标文件中的调试信息类型?

我有一个ELF目标文件。 我想知道它包含哪种类型的调试信息。 它是用PPC架构的Diab编译器(C源代码)编译的。 我很确定它是用调试符号构建的。 我尝试用dwarfdump提取调试信息,但我不工作,所以我猜调试信息不​​是DWARF类型。 $ dwarfdump file.elf No DWARF information present in file.elf 使用objdump显示调试信息是空的。 $ objdump -g file.elf file.elf: file format elf32-powerpc 即使ELF文件包含名为.debug_sfnames , .debug_srcinfo和.debug.srcinfo部分,这个ELF文件也不包含调试信息吗? 或者调试信息是以objdump无法处理的格式存储的?