[
編輯]交叉工具鏈名稱
i386
的工具名稱
歸屬作用
arm-linux-as
asbinutils
編譯arm
匯程式設計序
arm-linux-ar
arbinutils
把多個.o
合併乙個.o
或是靜態庫(.a)
arm-linux-ranlib
ranlib
binutils
為庫檔案建立索引,想當於*.as -s
arm-linux-ld
ldbinutils
聯接器(linker),
把多個.o
或是庫檔案鏈結乙個可以執行檔案
arm-linux-objdump
objdump
binutils
檢視目標檔案的(.o)
或是庫(.a
)的資訊
arm-linux-objcopy
objcopy
binutils
轉換成可以執行的elf
的檔案arm-linux-strip
strip
binutils
去掉elf
可以執行的資訊,是可以執行檔案變小
arm-linux-readelf
readelf
binutils
讀elf
的檔案頭
arm-linux-gcc
gccgcc
編譯.c
和.s的程式和彙編檔案
arm-linux-g++
g++gcc
編譯個g++程式[
編輯]
分別通過gcc和交叉編譯的工具進行編譯下面的例子,分別用靜態編譯、編譯成動態庫和反彙編的方法。[
編輯]hello_first.c
程式原始碼:[#include
void hello_first(void)
編輯]hello_second.c
程式原始碼:[#include
void hello_second(void)
編輯]hello.c
程式原始碼:[#include
void hello_first(void);
void hello_second(void);
int main(int argc,char *argv)
編輯][ 編輯]
[ 編輯]
直接編譯
[ 編輯]
方法一
#gcc -c hello_first.c[#gcc -c hello_second.c
#gcc -o hello hello.c hello_first.o hello_second.o
編輯]方法二
#gcc -c hello_first.c hello_second.c[#gcc -o hello hello.c hello_first.o hello_second.o
編輯]方法三
#gcc -c -o first.o hello_first.c[#gcc -c -o second.o hello_second.c
#gcc -o hello hello.c first.o second.o
編輯]方法四
#gcc -o hello hello.c hello_first.c hello_second.c[
編輯]編譯動態庫進行編譯
#gcc -c -fpic hello_first.c hello_second.c[#gcc -shared hello_first.o hello_second.o -o hello.so
#gcc -o hello hello.c hello.so
/*可以把編譯的hello.so拷貝到/lib下或是設定環境變數ld_library_path指向我們編譯的動態庫的
檔案位置,如,我們把hello.so拷貝到 /tmp下設定ld_library_path=/tmp,然後重新執行
#./hello*/
編輯]編譯成靜態庫進行編譯
#gcc -c hello_first.c hello_second.c[/*建立乙個靜態的鏈結庫*/
#ar -r libhello.a hello_first.o hello_second.o
/*為靜態鏈結庫建立索引*/
#ar -s libhello.a
#ranlib libhello.a
/*由靜態庫編譯成可以執行的檔案*/
#gcc -o hello hello.c -lhello -l./
或是#gcc -o hello hello.c libhello.a
/*編譯出來的hello可以脫離libhello.a執行*/
編輯]
#gcc -static -o hello hello.c hello_first.c hello_second.c[
編輯]
編譯的大小比較直接編譯
編譯成動態庫
編譯成靜態庫
編譯成靜態檔案[
編輯]
在對***,video,bmp的檔案進行讀取的時候,會對檔案的頭資訊或是具體的結構進行讀取,是可以通過進行結構 體進行讀取資訊,但是在正常編譯的時候(gcc),會出現記憶體的漏洞,
因為在正常定義的時候,編譯器會根據具體的系統結構是按整位元組處理,這樣我們提出的數值
就會出現問題,可以這樣解決。
例子:#include
int main(int argc,char **argv)
;printf("sizeof(struct test)=%d /n",sizeof(struct test));
}
輸出的結果並不是我們所需要的10byte,而是12byte,為什麼呢?因為在linux的4個位元組對齊的。在第二個位元組裡面得就僅僅用了兩個位元組,可是在我們讀取的檔案信
息的時候就會出錯,可以這樣解決:
#includeint main(int argc,char *argv)
__attribute__((packed));
printf("sizeof(struct test)=%d /n",sizeof(struct test))j;
}
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引數...
gcc常用的使用方法
自 linux公社 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這樣將編譯出乙個名為t...
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引數...