❶ 怎樣查看自己電腦的編譯器是多少位的
編譯器有好多種,每個語言都有,一般都有-v或者--version命令可以看版本信息,包括生成的代碼對應的機型(target),例如:Target: x86_64-w64-windows-gnu 就是生成64位的x86-64機器碼,編譯時可以靠-m32等命令控制.
至於編譯器本身,那跟你下載時的版本有關,如果你確實需要了解類似GCC本身是多少位的,可以這樣:
linux下:
filexxx#xxx代表程序名
例如:
[cosmia@excalibur~]$filesqlite3.i686sqlite3.x86_64
sqlite3.i686:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.32,BuildID[sha1]=,stripped
sqlite3.x86_64:ELF64-bitLSBexecutable,x86-64,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.32,BuildID[sha1]=,stripped
windows下:
用7zip打開那個.exe文件,看cpu信息
詳細參考方法:
http://www.hu.com/question/23027723
❷ 求從交叉編譯器生成的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;
}
❸ 如何看linux編譯後的文件
有,反編譯為匯編,不過因為 Linux 大部分為開源軟體,不如找源代碼……
所以,我沒注意過怎麼反匯編。一般經常調試程序的人都會這個。
另外,好像 gcc 編譯時可以生成過渡代碼,現在也有看過度代碼的,好像和匯編類似。
❹ 請問如何查看一個elf文件的編譯參數
我嘗試過使用readelf,沒有從輸出信息中發現我想要的
❺ 如何查看程序被哪個版本編譯器編譯的linux-gcc
那是不可能的,除非你加入了調試信息,也就是編譯的時候加入了-g參數,然後用gdb調試就可以顯示。最大程度上查看一個elf文件信息。
{
readelf -Wa a.out | head
readelf -wi a.out
readelf -p .comment a.out
objmp -s --section .comment audioplayer
}
如下:
[root@localhost rootfs]# readelf -Wa bin/gzip
復制代碼
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0xa080
Start of program headers: 52 (bytes into file)
Start of section headers: 1975444 (bytes into file)
Flags: 0x5000002, has entry point, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 25
Section header string table index: 24
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .note.ABI-tag NOTE 000080f4 0000f4 000020 00 A 0 0 4
[ 2] .init PROGBITS 00008114 000114 00000c 00 AX 0 0 4
[ 3] .text PROGBITS 00008120 000120 17fcfc 00 AX 0 0 16
[ 4] __libc_freeres_fn PROGBITS 00187e1c 17fe1c 000f20 00 AX 0 0 4
[ 5] __libc_thread_fre PROGBITS 00188d3c 180d3c 0000e4 00 AX 0 0 4
[ 6] .fini PROGBITS 00188e20 180e20 000008 00 AX 0 0 4
[ 7] .rodata PROGBITS 00188e28 180e28 058147 00 A 0 0 8
[ 8] __libc_subfreeres PROGBITS 001e0f70 1d8f70 00005c 00 A 0 0 4
[ 9] __libc_atexit PROGBITS 001e0fcc 1d8fcc 000004 00 A 0 0 4
[10] __libc_thread_sub PROGBITS 001e0fd0 1d8fd0 000008 00 A 0 0 4
[11] .ARM.extab PROGBITS 001e0fd8 1d8fd8 001b04 00 A 0 0 4
[12] .ARM.exidx ARM_EXIDX 001e2adc 1daadc 006ea8 00 AL 3 0 4
[13] .tdata PROGBITS 001f1984 1e1984 000018 00 WAT 0 0 4
[14] .tbss NOBITS 001f199c 1e199c 000034 00 WAT 0 0 4
[15] .init_array INIT_ARRAY 001f199c 1e199c 000004 00 WA 0 0 4
[16] .fini_array FINI_ARRAY 001f19a0 1e19a0 000008 00 WA 0 0 4
[17] .jcr PROGBITS 001f19a8 1e19a8 000004 00 WA 0 0 4
[18] .data.rel.ro PROGBITS 001f19ac 1e19ac 00002c 00 WA 0 0 4
[19] .got PROGBITS 001f19d8 1e19d8 00007c 04 WA 0 0 4
[20] .data PROGBITS 001f1a58 1e1a58 0008f7 00 WA 0 0 8
[21] .bss NOBITS 001f2350 1e234f 004828 00 WA 0 0 8
[22] __libc_freeres_pt NOBITS 001f6b78 1e234f 00003c 00 WA 0 0 4
[23] .ARM.attributes ARM_ATTRIBUTES 00000000 1e234f 00002b 00 0 0 1
[24] .shstrtab STRTAB 00000000 1e237a 000118 00 0 0 1
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01 .note.ABI-tag .init .text __libc_freeres_fn __libc_thread_freeres_fn .fini .rodata __libc_subfreeres __libc_atexit __libc_thread_subfreeres .ARM.extab .ARM.exidx
02 .tdata .init_array .fini_array .jcr .data.rel.ro .got .data .bss __libc_freeres_ptrs
03 .note.ABI-tag
04 .tdata .tbss
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "5TE"
Tag_CPU_arch: v5TE
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_unknown_44: 1 (0x1)
復制代碼
How to retrieve the GCC version used to compile a given ELF executable? http://stackoverflow.com/questions/2387040/how-to-retrieve-the-gcc-version-used-to-compile-a-given-elf-executable
QUES: I'd like to retrieve the GCC version used to compile a given executable. I tried readelf but didn't get the information. Any thoughts?
ANS: To complete what others have said: it's not stored in the object (or exe) file, unless you compile with debugging information! (option -g). If you compile with debug info, you can get it back with readelf:
復制代碼
[root@localhost test]# gcc a.c
[root@localhost test]# readelf -wi a.out
[root@localhost test]# gcc a.c -g
[root@localhost test]# readelf -wi a.out
The section .debug_info contains:
Compilation Unit @ offset 0x0:
Length: 135
Version: 2
Abbrev Offset: 0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
DW_AT_stmt_list : 0
DW_AT_high_pc : 0x400453
DW_AT_low_pc : 0x400448
DW_AT_procer : GNU C 4.1.2 20080704 (Red Hat 4.1.2-55)
DW_AT_language : 1 (ANSI C)
DW_AT_name : a.c
DW_AT_comp_dir : /work/farsight/test
<1><61>: Abbrev Number: 2 (DW_TAG_subprogram)
DW_AT_external : 1
DW_AT_name : main
DW_AT_decl_file : 1
DW_AT_decl_line : 4
DW_AT_prototyped : 1
DW_AT_type : <83>
DW_AT_low_pc : 0x400448
DW_AT_high_pc : 0x400453
DW_AT_frame_base : 0 (location list)
<1><83>: Abbrev Number: 3 (DW_TAG_base_type)
DW_AT_name : int
DW_AT_byte_size : 4
DW_AT_encoding : 5 (signed)
復制代碼
ANS2:
❻ 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。