㈠ 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