導航:首頁 > 源碼編譯 > 編譯版本信息到elf

編譯版本信息到elf

發布時間:2023-01-26 14:59:57

㈠ 有沒有誰在cygwin編譯過交叉編譯器,用於在windows系統下編譯出linux下的elf格式的可執行文件。

用cygwin和用linux基本一樣,只是速度下的區別。
不存在如此的交叉編譯器。可以使用CYGWIN版本的gcc

㈡ 為什麼編譯器版本出現在我的ELF可執行文件中

我只知道這些啦,到電子詞典的官方網站上應該有的!

我買了名人6188電子詞典,我看電子詞典里的程序都是*.elf的格式,這是用什麼編程軟體編的阿,在哪裡能找到?

ELF(Executable and Linking Format)是可執行連接格式

可執行連接格式是UNIX系統實驗室(USL)作為應用程序二進制介面
(Application Binary Interface(ABI)而開發和發布的。工具介面標准委
員會(TIS)選擇了正在發展中的ELF標准作為工作在32位INTEL體繫上不同操
作系統之間可移植的二進制文件格式。

用linux的gcc編譯器就可以生成elf文件

㈢ 請問如何查看一個elf文件的編譯參數

我嘗試過使用readelf,沒有從輸出信息中發現我想要的

㈣ eclipse編譯完了只輸出elf文件沒有hex文件

你先得在工程屬性里配置輸出hex文件,才能在Debug/Release文件夾下找到對應工程名的hex文件
右擊工程名,屬性->C/C++ Build->IAR Linker for ARM->Output Converter->勾選Generate additional output,並在output format下拉框里選擇Intel extended

㈤ 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位元組
......

程序頭表描述的是程序裡面各個段的信息。
這里來舉例看一下
比如程序頭,第一部分, 這個部分描述程序頭的信息,比如類型、大小、偏移等等;這個部分描述的就是程序頭的信息。

一個程序中到底有多少節信息,取決於這一部分,節頭表。

比較經典的,就是這里的導出函數信息。

㈥ 編譯內核出現a.elf 是什麼情況

正確的步驟是;
yum -y install make automake gcc g++ ncurses ncurses-dev ncurses-devel fakeroot wget bzip2 make patch ftp
cp /boot/config-2.6.18-92.el5 .config
關閉Selinux

vi /etc/sysconfig/selinux
SELINUX=disabled

打IMQ補丁:
$patch -p1 < ../linux-2.6.25-imq5.diff
$make menuconfig

驅動模塊
IMQ (intermediate queueing device) support (IMQ)
Location:
-> Device Drivers
-> Networking support
-> Network device support (NETDEVICES)
-> IMQ (intermediate queueing device) support (IMQ)

2.2編譯並安裝新內核
make menuconfig

make
make moles
make moles_install
make install

mkinitrd /boot/initrd_2.6.30.img 2.6.30 根據內核版本和指定參數生成映像文件
cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.30
cp /usr/src/linux-2.6.30/System.map /boot/System.map-2.6.30

㈦ andriod系統里怎麼使用readelf命令

readelf <option(s)> elf-file(s)

[功能]
用於顯示elf格式文件的信息。

[描述]
readelf用來顯示一個或者多個elf格式的目標文件的信息,可以通過它的選項來控制顯示哪些信息。這里的elf-file(s)就表示那些被檢查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文檔(這里一般指的是使用ar命令將一些elf文件打包之後生成的例如lib*.a之類的「靜態庫」文件)。
這個程序和objmp提供的功能類似,但是它顯示的信息更為具體,並且它不依賴BFD庫(BFD庫是一個GNU項目,它的目標就是希望通過一種統一的介面來處理不同的目標文件),所以即使BFD庫有什麼bug存在的話也不會影響到readelf程序。
運行readelf的時候,除了-v和-H之外,其它的選項必須有一個被指定。

ELF文件類型:
種類型的ELF文件:
a)可重定位文件:用戶和其他目標文件一起創建可執行文件或者共享目標文件,例如lib*.a文件。
b)可執行文件:用於生成進程映像,載入內存執行,例如編譯好的可執行文件a.out。
c)共享目標文件:用於和其他共享目標文件或者可重定位文件一起生成elf目標文件或者和執行文件一起創建進程映像,例如lib*.so文件。

ELF文件作用:
ELF文件參與程序的連接(建立一個程序)和程序的執行(運行一個程序),所以可以從不同的角度來看待elf格式的文件:
a)如果用於編譯和鏈接(可重定位文件),則編譯器和鏈接器將把elf文件看作是節頭表描述的節的集合,程序頭表可選。
b)如果用於載入執行(可執行文件),則載入器則將把elf文件看作是程序頭表描述的段的集合,一個段可能包含多個節,節頭表可選。
c)如果是共享文件,則兩者都含有。

ELF文件總體組成:
elf文件頭描述elf文件的總體信息。包括:
系統相關,類型相關,載入相關,鏈接相關。
系統相關表示:elf文件標識的魔術數,以及硬體和平台等相關信息,增加了elf文件的移植性,使交叉編譯成為可能。
類型相關就是前面說的那個類型。
載入相關:包括程序頭表相關信息。
鏈接相關:節頭表相關信息。

項(分別以長格式和短格式給出了):
-a
--all 顯示全部信息,等價於 -h -l -S -s -r -d -V -A -I.

-h
--file-header 顯示elf文件開始的文件頭信息.

-l
--program-headers
--segments 顯示程序頭(段頭)信息(如果有的話)。

-S
--section-headers
--sections 顯示節頭信息(如果有的話)。

-g
--section-groups 顯示節組信息(如果有的話)。

-t
--section-details 顯示節的詳細信息(-S的)。

-s
--syms
--symbols 顯示符號表段中的項(如果有的話)。

-e
--headers 顯示全部頭信息,等價於: -h -l -S

-n
--notes 顯示note段(內核注釋)的信息。

-r
--relocs 顯示可重定位段的信息。

-u
--unwind 顯示unwind段信息。當前只支持IA64 ELF的unwind段信息。

-d
--dynamic 顯示動態段的信息。

-V
--version-info 顯示版本段的信息。

-A
--arch-specific 顯示CPU構架信息。

-D
--use-dynamic 使用動態段中的符號表顯示符號,而不是使用符號段。

-x <number or name>
--hex-mp=<number or name> 以16進制方式顯示指定段內內容。number指定段表中段的索引,或字元串指定文件中的段名。

-w[liaprmfFsoR] or
--debug-mp[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges]
顯示調試段中指定的內容。

-I
--histogram 顯示符號的時候,顯示bucket list長度的柱狀圖。

-v
--version 顯示readelf的版本信息。

-H
--help 顯示readelf所支持的命令行選項。

-W
--wide 寬行輸出。

@file 可以將選項集中到一個文件中,然後使用這個@file選項載入。

[舉例]
先給出如下例子:
1,對於可執行文件形式的elf格式文件:
1)查看可執行程序的源代碼如下:
[quietheart@lv-k cppDemo]$ cat main.cpp
#include <iostream>
using std::cout;
using std::endl;
void my_print();

int main(int argc, char *argv[])
{
my_print();
cout<<"hello!"<<endl;
return 0;
}

void my_print()
{
cout<<"print!"<<endl;
}

2)編譯如下:
[quietheart@lv-k cppDemo]$ g++ main.cpp -o main
[quietheart@lv-k cppDemo]$ g++ -g main.cpp -o main.debug

3)編譯之後,查看生成的文件:
[quietheart@lv-k cppDemo]$ ls -l
總計 64
-rwxr-xr-x 1 quietheart quietheart 6700 07-07 18:04 main
-rw-r--r-- 1 quietheart quietheart 201 07-07 18:02 main.cpp
-rwxr-xr-x 1 quietheart quietheart 38932 07-07 18:04 main.debug
這里,main.debug是帶有調試信息的可執行文件,main是一般的可執行文件。

2,對於庫文件形式的elf格式文件:
1)查看庫的源代碼如下:
//myfile.h
#ifndef __MYFILE_H
#define __MYFILE_H
void printInfo();
#endif

//myfile.cpp
#include "myfile.h"
#include <iostream>
using std::cout;
using std::endl;
void printInfo()
{
cout<<"hello"<<endl;
}
2)編譯如下:
[quietheart@lv-k bak]$ g++ -c myfile.cpp
[quietheart@lv-k bak]$ g++ -shared -fPCI -o libmy.so myfile.o
[quietheart@lv-k bak]$ ar -r libmy.a myfile.o
ar: creating libmy.a

3)編譯之後,查看生成的文件:
[quietheart@lv-k bak]$ ls -l
總計 44
-rw-r--r-- 1 quietheart quietheart 2154 07-08 16:14 libmy.a
-rwxr-xr-x 1 quietheart quietheart 5707 07-08 16:08 libmy.so
-rwxr-xr-x 1 quietheart quietheart 117 07-08 16:06 myfile.cpp
-rwxr-xr-x 1 quietheart quietheart 63 07-08 16:08 myfile.h
-rw-r--r-- 1 quietheart quietheart 2004 07-08 16:08 myfile.o
libmy.a libmy.so myfile.cpp myfile.h myfile.o
這里,分別生成目標文件myfile.o,共享庫文件libmy.so,和靜態庫文件libmy.a。

㈧ 求從交叉編譯器生成的elf文件中讀取全局變數信息的函數

樓主,這個恐怕不是一個函數能解決的,ELF文件格式還是有點復雜的。 我以前做過類似的功能,從ELF文件中載入所有符號表信息,字元串信息,並下載代碼。 我推薦你用一個開源的庫:ELFIO。 我想這個庫應該可以實現你的功能,只是你要去研究一下它的用法。 當然,你得首先對ELF文件格式有所了解。ELFIO庫下載地址: http://sourceforge.net/projects/elfio/ ================================這是我以前寫過的載入ELF中所有Section信息的例子: BOOL LoadELF(char* pFilename)
{
CString strName,tmp;
IELFI* pReader;

if ( ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI( &pReader ) ) {
Msg( "Can't create ELF reader.\r\n",2,0);
return FALSE;
}
if ( ERR_ELFIO_NO_ERROR != pReader->Load(pFilename ) ) {
Msg( "Can't open input elf file.\r\n",2,0);
return FALSE;
} int nSecNo = pReader->GetSectionsNum();
for (int i = 0; i < nSecNo; i++ )
{ // For all sections
const IELFISection* pSec = pReader->GetSection( i );
printf("%s\n",pSec->GetName().c_str());
Elf32_Half index= pSec->GetIndex() ;
std::string name = pSec->GetName() ;
Elf32_Word type =pSec->GetType() ;
Elf32_Addr addr = pSec->GetAddress() ;
Elf32_Word size = pSec->GetSize() ;
Elf32_Word link = pSec->GetLink() ;
Elf32_Word info = pSec->GetInfo() ;
Elf32_Word aa = pSec->GetAddrAlign() ;
Elf32_Word esize = pSec->GetEntrySize() ;
const char* p = pSec->GetData() ;
Elf32_Word flag = pSec->GetFlags() ;
strName = pSec->GetName().c_str();strName.MakeUpper();
//如果未指定section,讀取所有SHF_EXECINSTR屬性的Section
if(g_MapScetion.GetCount()==0)
{
if(flag&SHF_EXECINSTR)
LoadElfSection((BYTE*)pSec->GetData(),pSec->GetAddress(),pSec->GetSize(),pList,pAddInfo);
}
else
{
if(g_MapScetion.Lookup(strName,tmp))
LoadElfSection((BYTE*)pSec->GetData(),pSec->GetAddress(),pSec->GetSize(),pList,pAddInfo);
}

pSec->Release();
} pReader->Release();
return TRUE;
}

㈨ 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)輸出文件中不要重定位信息和符號信息,縮小了文件尺寸

㈩ ELF文件詳解

姓名:羅學元    學號:21181214375     學院:廣州研究院

【嵌牛導讀】什麼是ELF文件

【嵌牛鼻子】什麼是ELF文件

【嵌牛提問】什麼是ELF文件,它有哪些部分組成、每部分包含哪些信息

          ELF文件分為四個部分:elf header,program header table,section header table,dynamic symbol table。其中節頭表(section header  table) 和 段頭表(program header table) 中用到的數據相同,只是組織方式不同。

一、ELF header

每個ELF文件都必須存在一個ELF_Header,這里存放了很多重要的信息用來描述整個文件的組織,如: 版本信息,入口信息,偏移信息等,程序執行也必須依靠其提供的信息:

數據結構如下:

e_xxx 和上面對應表如下圖:

其中數據類型如下:

二、Program header table 程序頭表

        存儲so文件運行時所需要的信息,這部分信息會直接被linker使用,用於載入so文件,告訴系統如何在內存中創建映像,在圖中也可以看出來,有程序頭部表才有段,有段就必須有程序頭部表,其中存放各個段的基本信息(包括地址指針)

節到段的映射:

    鏈接視圖是以節(section)為單位,執行視圖是以段(segment)為單位。鏈接視圖就是在鏈接時用到的視圖,而執行視圖則是在執行時用到的視圖。上圖左側的視角是從鏈接來看的,右側的視角是執行來看的。

段(Segment): 就是將文件分成一段一段映射到內存中,段中通常包括一個或多個節區。

       那麼為什麼需要節和段兩種視圖? 當ELF文件被載入到內存中後,系統會將多個具有相同許可權(flg值)section合並一個segment。操作系統往往以頁為基本單位來管理內存分配,一般頁的大小為4096B,即4KB的大小。同時,內存的許可權管理的粒度也是以頁為單位,頁內的內存是具有同樣的許可權等屬性,並且操作系統對內存的管理往往追求高效和高利用率這樣的目標。ELF文件在被映射時,是以系統的頁長度為單位的,那麼每個section在映射時的長度都是系統頁長度的整數倍,如果section的長度不是其整數倍,則導致多餘部分也將佔用一個頁。而我們從上面的例子中知道,一個ELF文件具有很多的section,那麼會導致內存浪費嚴重。這樣可以減少頁面內部的碎片,節省了空間,顯著提高內存利用率。

readelf -S xxx # 用來查看可執行文件中有哪些section,如下圖:

readelf --segments xxx # 可以查看該文件的執行視圖,下圖紅框部分為上圖的節信息在段中的顯示:

    最後載入進內存的只有program header table 程序頭表裡的load段,其他都只是描述信息,載入過程中用到,但是最後載入進去內存的只有load段。

三、Section header table 節頭部表

           類似與程序頭部表,但與其相對應的是節區(Section);節區(Section): 將文件分成一個個節區,每個節區都有其對應的功能,如符號表,哈         希 表 等。

.relname和.relaname: 010Editor打開so,展現形式為下圖,.rel.dyn 和 .rel.plt ,是用來重定向dyn和plt的,也就是靜態情況下,存放偏移值,如果進行動態調試的時候,就會加上基址變成絕對地址(重定向)。

下面第二張圖中,左邊紅框就是偏移值,右邊紅框只要把基址加進來,就是絕對地址,把基址加進來的過程就是重定向的過程:

.plt 程序鏈接表,用於做映射關系,拿到依賴so的絕對地址,做重定向的:

四、Dynamic symbol table

     這里是符號表,也就是會用到的所有函數名稱表,包括自己寫的函數和依賴的系統so中的函數,到時候.plt會對這部分重定向 。

閱讀全文

與編譯版本信息到elf相關的資料

熱點內容
android編譯3070驅動 瀏覽:632
nginxphpfpm啟動 瀏覽:53
衰鬼撬牆角演員表 瀏覽:699
北鎮加密遮陽網直接生產廠 瀏覽:705
圖紙加密需要密碼 瀏覽:411
linux斷開telnet 瀏覽:760
必要app賣的眼鏡怎麼樣 瀏覽:159
好看的社保aqd 瀏覽:285
cad導出pdf黑白 瀏覽:999
男男激情電影 瀏覽:344
草根電影網站在線觀看 瀏覽:209
c語言編譯中怎麼看定義了哪些宏 瀏覽:132
男人文學 瀏覽:541
現在觀看網站 瀏覽:463
安卓上的app怎麼轉移另一個iphone 瀏覽:708
訊晨財經伺服器出現問題怎麼辦 瀏覽:354
華為刪除命令大全 瀏覽:712
女主很開放主動的小說 瀏覽:48
男朋友是程序員不懂浪漫怎麼辦呢 瀏覽:515
梁焯滿電影全集全部 瀏覽:20