當前位置:首頁 » 編程軟體 » 怎麼打開被gcc編譯過的軟體

怎麼打開被gcc編譯過的軟體

發布時間: 2024-11-02 12:00:52

⑴ 如何查看程序被哪個版本編譯器編譯的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:

⑵ 在Ubuntu系統的超級終端中用GCC編譯成的.o格式的文件,怎麼在windows中運行

linux下的執行文件windows下是運行不了的 !

你需要到windows下 用MinGW 版的gcc 重新編譯 !
裝個dev c++ 或者 C-Free 把gcc的路徑添加到環境變數 path里
就能在cmd下 使用gcc命令編譯了!
命令一樣
gcc -Wall Hello.c -o hello.exe
加不加.exe都可以

⑶ gcc編譯後的文件如何運行

Windows系統
假如生成的可執行文件名稱為prog.exe,位於D:\cpp文件夾下,那麼打開命令行,運行下面兩條命令
cd D:\cpp
prog.exe
注意,如果用gcc編譯的時候未指定可執行文件名稱,則默認為a.exe

Linux系統
假如生成的可執行文件名稱為prog,位於home下的CPP文件夾,那麼打開終端,運行下面兩條命令
cd ~/CPP
./prog
注意,如果用gcc編譯的時候未指定可執行文件名稱,則默認為a.out

⑷ 下載了GCC,但是打開文件夾不知道哪個是編譯程序

擼主啊,首先GCC是Linux上的東西,移植到Windows下使用比較的那個啥……

其次,所謂的命令其實就是一個可執行的程序,一般放在bin文件夾下,然後將該bin文件夾的路徑加入到系統的path中,就可以直接使用命令行調用了。擼主可以看一下bin文件夾下是不是有個gcc.exe,這個就是gcc命令的「真身」了。

最後,擼主想要他工作,就要配置好,主要是文件路徑,path變數啥的。如果你真的很想使用mingw的話,建議使用CodeBlocks。他自帶了mingw,而且安裝時就配置好了。

我用的公司的機子,要做IE 6兼容測試,所以一直是XP的系統。讓您賤笑了。

多嘴一句,擼主既然想要學習GCC應該裝個Linux玩玩,感覺不錯哦。如果想在Windows這棵樹上弔死,應該找VS這個大樹枝啊。.net1 .net2 .net3 .net3.5 .net4.0 .net 4.5 .net正無窮~

有句老話說得好,真正的猛士,敢於在Windows這棵樹上屌絲。看到這里是不是感覺眼角有翔滑落~哎~出師未捷身先死,長使屌絲淚滿襟。說到這里,我又一次望著「窗口」嘆息~我有一個理想,要讓所有裝有Windows系統的電腦都換成Linux,讓微軟在蛋碎的節奏中顫抖吧。好了,說道這里,我就不多說了,擦乾翔,洗洗睡吧,明天還要搬磚呢。

對了忘了說了,擼主想要GCC命令可以這樣,先安裝個Linux,進入系統後使用命令終端,使用man gcc ,好了現在可以查看GCC命令的詳細文檔了。PS:如果此時覺得英語比較不好,還是網路吧。

現在擼主可以吐槽了。

⑸ gcc編譯器究竟怎麼打開我竟然在gcc的安裝文件夾中找不到gcc的打開文件

你先用vim 或者直接用gedit編寫好程序,然後直接輸入命令就可以了,比如你的程序是helloworld.c,那麼你可以輸入命令:
編譯命令:gcc -o helloworld helloworld.c
運行命令./helloworld

希望這樣的回答對你有幫助!

gcc的使用方法

1。gcc包含的c/c++編譯器
gcc,cc,c++,g++,gcc和cc是一樣的,c++和g++是一樣的,一般c程序就用gcc編譯,c++程序就用g++編譯

2。gcc的基本用法
gcc test.c這樣將編譯出一個名為a.out的程序
gcc test.c -o test這樣將編譯出一個名為test的程序,-o參數用來指定生成程序的名字

3。為什麼會出現undefined reference to 'xxxxx'錯誤?
首先這是鏈接錯誤,不是編譯錯誤,也就是說如果只有這個錯誤,說明你的程序源碼本身沒有問題,是你用編譯器編譯時參數用得不對,你沒有指定鏈接程序要用到得庫,比如你的程序里用到了一些數學函數,那麼你就要在編譯參數里指定程序要鏈接數學庫,方法是在編譯命令行里加入-lm。

4。-l參數和-L參數
-l參數就是用來指定程序要鏈接的庫,-l參數緊接著就是庫名,那麼庫名跟真正的庫文件名有什麼關系呢?
就拿數學庫來說,他的庫名是m,他的庫文件名是libm.so,很容易看出,把庫文件名的頭lib和尾.so去掉就是庫名了。

好了現在我們知道怎麼得到庫名了,比如我們自已要用到一個第三方提供的庫名字叫libtest.so,那麼我們只要把libtest.so拷貝到/usr/lib里,編譯時加上-ltest參數,我們就能用上libtest.so庫了(當然要用libtest.so庫里的函數,我們還需要與libtest.so配套的頭文件)。

放在/lib和/usr/lib和/usr/local/lib里的庫直接用-l參數就能鏈接了,但如果庫文件沒放在這三個目錄里,而是放在其他目錄里,這時我們只用-l參數的話,鏈接還是會出錯,出錯信息大概是:"/usr/bin/ld: cannot find -lxxx",也就是鏈接程序ld在那3個目錄里找不到libxxx.so,這時另外一個參數-L就派上用場了,比如常用的X11的庫,它放在/usr/X11R6/lib目錄下,我們編譯時就要用-L/usr/X11R6/lib -lX11參數,-L參數跟著的是庫文件所在的目錄名。再比如我們把libtest.so放在/aaa/bbb/ccc目錄下,那鏈接參數就是-L/aaa/bbb/ccc -ltest

另外,大部分libxxxx.so只是一個鏈接,以RH9為例,比如libm.so它鏈接到/lib/libm.so.x,/lib/libm.so.6又鏈接到/lib/libm-2.3.2.so,如果沒有這樣的鏈接,還是會出錯,因為ld只會找libxxxx.so,所以如果你要用到xxxx庫,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一個鏈接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

手工來寫鏈接參數總是很麻煩的,還好很多庫開發包提供了生成鏈接參數的程序,名字一般叫xxxx-config,一般放在/usr/bin目錄下,比如gtk1.2的鏈接參數生成程序是gtk-config,執行gtk-config --libs就能得到以下輸出"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmole -lglib -ldl -lXi -lXext -lX11 -lm",這就是編譯一個gtk1.2程序所需的gtk鏈接參數,xxx-config除了--libs參數外還有一個參數是--cflags用來生成頭文
件包含目錄的,也就是-I參數,在下面我們將會講到。你可以試試執行gtk-config --libs --cflags,看看輸出結果。
現在的問題就是怎樣用這些輸出結果了,最苯的方法就是復制粘貼或者照抄,聰明的辦法是在編譯命令行里加入這個`xxxx-config --libs --cflags`,比如編譯一個gtk程序:gcc gtktest.c `gtk-config --libs --cflags`這樣就差
不多了。注意`不是單引號,而是1鍵左邊那個鍵。

除了xxx-config以外,現在新的開發包一般都用pkg-config來生成鏈接參數,使用方法跟xxx-config類似,但xxx-config是針對特定的開發包,但pkg-config包含很多開發包的鏈接參數的生成,用pkg-config --list-all命令可以列出所支持的所有開發包,pkg-config的用法就是pkg-config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里列出名單中的一個,比如gtk1.2的名字就是gtk+,pkg-config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一樣的。比如:gcc gtktest.c `pkg-config gtk+ --libs --cflags`。

5。-include和-I參數
-include用來包含頭文件,但一般情況下包含頭文件都在源碼里用#include xxxxxx實現,-include參數很少用。-I參數是用來指定頭文件目錄,/usr/include目錄一般是不用指定的,gcc知道去那裡找,但是如果頭文件不在/usr/include里我們就要用-I參數指定了,比如頭文件放在/myinclude目錄里,那編譯命令行就要加上-I/myinclude參數了,如果不加你會得到一個"xxxx.h: No such file or directory"的錯誤。-I參數可以用相對路徑,比如頭文件在當前目錄,可以用-I.來指定。上面我們提到的--cflags參數就是用來生成-I參數的。

6。-O參數
這是一個程序優化參數,一般用-O2就是,用來優化程序用的,比如gcc test.c -O2,優化得到的程序比沒優化的要小,執行速度可能也有所提高(我沒有測試過)。

7。-shared參數
編譯動態庫時要用到,比如gcc -shared test.c -o libtest.so

8。幾個相關的環境變數
PKG_CONFIG_PATH:用來指定pkg-config用到的pc文件的路徑,默認是/usr/lib/pkgconfig,pc文件是文本文件,擴展名是.pc,裡面定義開發包的安裝路徑,Libs參數和Cflags參數等等。
CC:用來指定c編譯器。
CXX:用來指定cxx編譯器。
LIBS:跟上面的--libs作用差不多。
CFLAGS:跟上面的--cflags作用差不多。
CC,CXX,LIBS,CFLAGS手動編譯時一般用不上,在做configure時有時用到,一般情況下不用管。
環境變數設定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx

9。關於交叉編譯
交叉編譯通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上,比如在我們地PC平台(X86 CPU)上編譯出能運行在sparc CPU平台上的程序,編譯得到的程序在X86 CPU平台上是不能運行的,必須放到sparc CPU平台上才能運行。
當然兩個平台用的都是linux。

這種方法在異平台移植和嵌入式開發時用得非常普遍。

相對與交叉編譯,我們平常做的編譯就叫本地編譯,也就是在當前平台編譯,編譯得到的程序也是在本地執行。

用來編譯這種程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的就叫本地編譯器,一般用的都是gcc,但這種gcc跟本地的gcc編譯器是不一樣的,需要在編譯gcc時用特定的configure參數才能得到支持交叉編譯的gcc。

為了不跟本地編譯器混淆,交叉編譯器的名字一般都有前綴,比如sparc-xxxx-linux-gnu-gcc,sparc-xxxx-linux-gnu-g++ 等等

10。交叉編譯器的使用方法
使用方法跟本地的gcc差不多,但有一點特殊的是:必須用-L和-I參數指定編譯器用sparc系統的庫和頭文件,不能用本地(X86)
的庫(頭文件有時可以用本地的)。
例子:
sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib -I/path/to/sparcInclude

熱點內容
mysql存儲的中文亂碼 發布:2024-11-23 03:58:42 瀏覽:886
怎麼搭建卡密伺服器 發布:2024-11-23 03:53:54 瀏覽:774
享壽演算法 發布:2024-11-23 03:46:26 瀏覽:665
兒童變編程 發布:2024-11-23 03:32:03 瀏覽:148
vb編程點餐 發布:2024-11-23 03:20:38 瀏覽:892
主要搞編程 發布:2024-11-23 03:10:25 瀏覽:569
常德php 發布:2024-11-23 03:07:17 瀏覽:573
dlink路由器密碼是多少 發布:2024-11-23 03:03:41 瀏覽:613
海科學編程 發布:2024-11-23 03:02:08 瀏覽:848
安卓怎麼控制索尼相機 發布:2024-11-23 02:54:56 瀏覽:281