㈠ Uboot编译为什么没有生成elf格式的文件
1、通过gcc编译出来的是elf文件
2、通过objcpy可以把elf文件转换为bin文件
CC=ppc-gcc
LD=ppc-ld
OBJCOPY=ppc-obj
$(CC)-g$(CFLAG)-cboot.S
#先将boot.S文件生成boot.o
$(LD)-g-Bstatic-T$(LDFILE)
-Ttext0x12345600boot.o
--start-group-Mapboot.map-oboot.elf
#再将boot.o生成boot.elf
$(OBJCOPY)-Obinary-R.note-R.comment-Sboot.elfboot.bin
#接着将boot.elf转换为boot.bin
#使用-Obinary(或--out-target=binary)输出为原始的二进制文件
#使用-R.note(或--remove-section)输出文件中不要.note这个section,缩小了文件尺寸
#使用-S(或--strip-all)输出文件中不要重定位信息和符号信息,缩小了文件尺寸
㈡ C语言文件的编译与执行的四个阶段并分别描述
开发C程序有四个步骤:编辑、编译、连接和运行。
任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。
1、预处理:导入源程序并保存(C文件)。
2、编译:将源程序转换为目标文件(Obj文件)。
3、链接:将目标文件生成为可执行文件(EXE文件)。
4、运行:执行,获取运行结果的EXE文件。
(2)pe或elf文件编译扩展阅读:
将C语言代码分为程序的几个阶段:
1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。
2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。
3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。
4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。
㈢ ELF文件浅析
前言:在逆向工作流程中,我们会接触到so文件,并且在某种情况下会对so文件进行处理。 在文件的角度而言,so隶属于 ELF 文件。 站在ELF文件角度来分析一下so文件。
ELF 文件大致分为3个主要部分
1、ELF HEAD --ELF文件头部分
2、 Program Header Table --程序头表
3、Section Header Table --节头表
这个部分称为“头”,里面大致描述在这个文件里面的组织。如:文件魔术、目标架构体系(如ARM、X86...)、版本信息、各个部分的大小、各个部分的偏移起始地址等等。
下面描述的位置都是固定的,且位置都是紧接着下一部分的位置。(有误欢迎指出)
这里我用的是IDA的android_server文件做演示,来简单看一部分内容。
文件的标识信息(e_ident):前16字节 (包括魔术部分:前4字节 如.ELF)
文件类型(e_type ):2字节
目标架构(e_machine ):2字节
版本(e_version):4字节
程序入口虚拟地址(e_entry ):4字节
程序头部表偏移地址(e_phoff ):4字节
节区头部表偏移地址(e_shoff ):4字节
保存与文件相关的,特定于处理器的标志(e_flags ):4字节
ELF头的大小(e_ehsize ):2字节
每个程序头部表的大小(e_phentsize ):2字节
程序头部表的数量(e_phnum ):2字节
每个节区头部表的大小(e_shentsize):2字节
节区头部表的数量(e_shnum ):2字节
节区字符串表位置(e_shstrndx):2字节
......
程序头表描述的是程序里面各个段的信息。
这里来举例看一下
比如程序头,第一部分, 这个部分描述程序头的信息,比如类型、大小、偏移等等;这个部分描述的就是程序头的信息。
一个程序中到底有多少节信息,取决于这一部分,节头表。
比较经典的,就是这里的导出函数信息。
㈣ 如何反编译linux里的elf文件
objmp -S a.out > a.S