首先簡要闡述關於gcc、glibc和 binutils模塊之間的關係linux
1、關於gcc、glibc和binutils模塊之間的關係c++
一、gcc(gnu collect compiler)是一組編譯工具的總稱。它主要完成的工做任務是「預處理」和「編譯」,以及提供了與編譯器緊密相關的運行庫的支持,如 libgcc_s.so、libstdc++.so等。程序員
二、binutils提供了一系列用來建立、管理和維護二進制目標文件的工具程序,如彙編(as)、鏈接(ld)、靜態庫歸檔(ar)、反彙編 (objdump)、elf結構分析工具(readelf)、無效調試信息和符號的工具(strip)等。一般,binutils與gcc是緊密相集成 的,沒有binutils的話,gcc是不能正常工做的。shell
三、glibc是gnu發佈的libc庫,也即c運行庫。glibc是linux系統中最底層的api(應用程序開發接口),幾乎其它任何的運行庫 都會倚賴於glibc。glibc除了封裝linux操做系統所提供的系統服務外,它自己也提供了許多其它一些必要功能服務的實現,主要的以下:
(1)string,字符串處理
(2)signal,信號處理
(3)dlfcn,管理共享庫的動態加載
(4)direct,文件目錄操做
(5)elf,共享庫的動態加載器,也即interpreter
(6)iconv,不一樣字符集的編碼轉換
(7)inet,socket接口的實現
(8)intl,國際化,也即gettext的實現
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虛擬終端設備的管理,及系統的安全訪問
(13)malloc,動態內存的分配與管理
(14)nis編程
(15)stdlib,其它基本功能
api
2、redhat9上升級gccsass
一、升級這些庫時,最好不要覆蓋系統中缺省的;由於這些庫,尤爲是glibc庫,是系統中最核心的共享庫和工具,若是盲目覆蓋,極可能致使整個系統 癱瘓,由於通常更新glibc庫時,其它全部以來libc庫的共享庫都須要從新被編譯一遍。所以,爲了調試某個程序進入glibc時,最好把glibc安 裝到/usr/local/lib下。安全
二、首先編譯glibc庫。注意最好令創建一個glibc-build的目錄,configure時加上--enable-add- ons=linuxthreads選項。make install安裝到/usr/local下。架構
三、修改gcc的spec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld- linux.so.2爲/usr/local/lib下的新的共享庫裝載器。app
四、編譯binutils庫,此時被編譯出的程序會鏈接到/usr/local/lib下的新的libc庫。注意,在configure前,須要設 置ld缺省鏈接的路徑(LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),不然binutils會 configure出錯,找不到libc中的一些符號。具體步驟以下:
(1)export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
(2)mkdir binutils-build && cd binutils-build
(3)../binutils-2.13.90.0.18/configure
(4)make
(5)make -C ld clean
(6)make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/bin(設置編譯後的ld的缺省庫搜索路徑,後面的比前面的優先級高)
(7)make install
3、總結
一、運行時,動態庫的裝載依賴於ld-linux.so.6的實現,它查找共享庫的順序以下:
(1)ld-linux.so.6在可執行的目標文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;當glibc安裝到/usr/local下時,它查找/usr/local /lib
(3)LD_LIBRARY_PATH環境變量中所設定的路徑
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路徑,由ldconfig生成二進制的 ld.so.cache中
二、編譯時,搜索庫的路徑順序以下:
(1)ld-linux.so.6由gcc的spec文件中所設定
(2)gcc --print-search-dirs所打印出的路徑,主要是libgcc_s.so等庫。能夠經過GCC_EXEC_PREFIX來設定
(3)LIBRARY_PATH環境變量中所設定的路徑,或編譯的命令行中指定的-L/usr/local/lib
(2)binutils中的ld所設定的缺省搜索路徑順序,編譯binutils時指定。
(能夠經過「ld --verbose | grep SEARCH」來查看)
三、二進制程序的搜索路徑順序爲PATH環境變量中所設定。通常/usr/local/bin高於/usr/bin
四、編譯時的頭文件的搜索路徑順序,與library的查找順序相似。通常/usr/local/include高於/usr/include
————————————————————————————————————
前言
若是普通編程不須要了解這些東西,若是想精確控制你的對象文件的格式或者你想查看一下文件對象裏的內容以便做出某種判斷,剛你能夠看一下下面的工 具:objdump, nm, ar。固然,本文不可能很是詳細的說明它們的使用方法和功能。若是你以爲本文不夠清楚,你可使用:man. 個人計劃只是想讓更多的人瞭解這些工具,之後在從此 的編程過程當中能有所幫助。
操做系統: Linux
開始
ar,nm,objdump,objcopy
From: http://blog.163.com/tao198352__4232/blog/static/85020645201081993325589/
ar命令能夠用來建立、修改庫,也能夠從庫中提出單個模塊。庫是一單獨的文件,裏面包含了按照特定的結構組織起來的其它的一些文件(稱作此庫文件的member)。原始文件的內容、模式、時間戳、屬主、組等屬性都保留在庫文件中。
下面是ar命令的格式:
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
例如咱們能夠用ar rv libtest.a hello.o hello1.o 來 生成一個庫,庫名字是test,連接時能夠用-ltest連接。該庫中存放了兩個模塊hello.o和hello1.o。選項前能夠有‘-'字符,也能夠 沒有。下面咱們來看看命令的操做選項和任選項。如今咱們把{dmpqrtx}部分稱爲操做選項,而[abcfilNoPsSuvV]部分稱爲任選項。
{dmpqrtx}中的操做選項在命令中只能而且必須使用其中一個,它們的含義以下:
下面在看看可與操做選項結合使用的任選項:
nm基本用法
nm用來列出目標文件的符號清單。下面是nm命令的格式:
nm [-a│--debug-syms] [-g│--extern-only]
[-B] [-C│--demangle[=style]] [-D│--dynamic]
[-S│--print-size] [-s│--print-armap]
[-A│-o│--print-file-name][--special-syms]
[-n│-v│--numeric-sort] [-p│--no-sort]
[-r│--reverse-sort] [--size-sort] [-u│--undefined-only]
[-t radix│--radix=radix] [-P│--portability]
[--target=bfdname] [-f format│--format=format]
[--defined-only] [-l│--line-numbers] [--no-demangle]
[-V│--version] [-X 32_64] [--help] [objfile...]
若是沒有爲nm命令指出目標文件,則nm假定目標文件是a.out。下面列出該命令的任選項,大部分支持"-"開頭的短格式和"—"開頭的長格式。
例如nm libtest.a的輸出以下:
CPThread.o:則nm -A 的輸出以下:
libtest.a:CPThread.o:00000068 T Main__8CPThreadPv對於每個符號,nm列出其值(the symbol value),類型(the symbol type)和其名字(the symbol name)。
符號
類型
|
說明
|
A
|
該符號的值是絕對的,在之後的連接過程當中,不容許進行改變。這樣的符號值,經常出如今中斷向量表中,例如用符號來表示各個中斷向量函數在中斷向量表中的位置。
|
B
|
該符號的值出如今非初始化數據段
(bss)
中。例如,在一個文件中定義全局
static int test
。則該符號
test
的類型爲
b
,位於
bss section
中。其值表示該符號在
bss
段中的偏移。通常而言,
bss
段分配於
RAM
中
|
C
|
該符號爲
common
。
common symbol
是未初始話數據段。該符號沒有包含於一個普通
section
中。只有在連接過程當中才進行分配。符號的值表示該符號須要的字節數。例如在一個
c
文件中,定義
int test
,而且該符號在別的地方會被引用,則該符號類型即爲
C
。不然其類型爲
B
。
|
D
|
該符號位於初始話數據段中。通常來講,分配到
data section
中。例如定義全局
int baud_table[5] = {9600, 19200, 38400, 57600, 115200}
,則會分配於初始化數據段中
。
|
G
|
該符號也位於初始化數據段中。主要用於
small object
提升訪問
small data object
的一種方式。
|
I
|
該符號是對另外一個符號的間接引用。
|
N
|
該符號是一個
debugging
符號。
|
R
|
該符號位於只讀數據區。例如定義全局
const int test[] = {123, 123};
則
test
就是一個只讀數據區的符號。注意在
cygwin
下若是使用
gcc
直接編譯成
MZ
格式時,源文件中的
test
對應
_test
,而且其符號類型爲
D
,即初始化數據段中。可是若是使用
m6812-elf-gcc
這樣的交叉編譯工具,源文件中的
test
對應目標文件的
test,
即沒有添加下劃線,而且其符號類型爲
R
。通常而言,位於
rodata section
。值得注意的是,若是在一個函數中定義
const char *test = 「abc」, const char test_int = 3
。使用
nm
都不會獲得符號信息,可是字符串「
abc
」分配於只讀存儲器中,
test
在
rodata section
中,大小爲
4
。
|
S
|
符號位於非初始化數據區,用於
small object
。
|
T
|
該符號位於代碼區
text section
。
|
U
|
該符號在當前文件中是未定義的,即該符號的定義在別的文件中。例如,當前文件調用另外一個文件中定義的函數,在這個被調用的函數在當前就是未定義的;可是在定義它的文件中類型是
T
。可是對於全局變量來講,在定義它的文件中,其符號類型爲
C
,在使用它的文件中,其類型爲
U
。
|
V
|
該符號是一個
weak object
。
|
W
|
The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
|
-
|
該符號是
a.out
格式文件中的
stabs symbol
。
|
?
|
該符號類型沒有定義
|
objdump基本用法
objdump有點象那個快速查看之流的工具,就是以一種可閱讀的格式讓你更多地瞭解二進制文件可能帶有的附加信息。對於通常只想讓本身程序跑起來的程序 員,這個命令沒有更多意義,對於想進一步瞭解系統的程序員,應該掌握這種工具,至少你能夠本身寫寫shellcode了,或者看看人家給的exploit 中的shellcode是什麼東西。更多關於目標文件的內容分析建議看看《深刻理解計算機》這本書的第二部分第七章節 。
經常使用法:
objdump [-a│--archive-headers]
[-b bfdname│--target=bfdname]
[-C│--demangle[=style] ]
[-d│--disassemble]
[-D│--disassemble-all]
[-z│--disassemble-zeroes]
[-EB│-EL│--endian={big │ little }]
[-f│--file-headers]
[--file-start-context]
[-g│--debugging]
[-e│--debugging-tags]
[-h│--section-headers│--headers]
[-i│--info]
[-j section│--section=section]
[-l│--line-numbers]
[-S│--source]
[-m machine│--architecture=machine]
[-M options│--disassembler-options=options]
[-p│--private-headers]
[-r│--reloc]
[-R│--dynamic-reloc]
[-s│--full-contents]
[-W│--dwarf]
[-G│--stabs]
[-t│--syms]
[-T│--dynamic-syms]
[-x│--all-headers]
[-w│--wide]
[--start-address=address]
[--stop-address=address]
[--prefix-addresses]
[--[no-]show-raw-insn]
[--adjust-vma=offset]
[--special-syms]
[-V│--version]
[-H│--help]
objfile...
選項詳解:
--archive-headers
-a 顯示檔案庫的成員信息,與 ar tv 相似
objdump -a libpcap.a
和 ar -tv libpcap.a 顯示結果比較比較
顯然這個選項沒有什麼意思。
--adjust-vma=offset
When dumping information, first add offset to all
the section addresses. This is useful if the sec-
tion addresses do not correspond to the symbol
table, which can happen when putting sections at
particular addresses when using a format which can
not represent section addresses, such as a.out.
-b bfdname
--target=bfdname
指定目標碼格式。這不是必須的,objdump能自動識別許多格式,
好比:objdump -b oasys -m vax -h fu.o
顯示fu.o的頭部摘要信息,明確指出該文件是Vax系統下用Oasys
編譯器生成的目標文件。objdump -i將給出這裏能夠指定的
目標碼格式列表
--demangle
-C 將底層的符號名解碼成用戶級名字,除了去掉全部開頭
的下劃線以外,還使得C++函數名以可理解的方式顯示出來。
--debugging
顯示調試信息。企圖解析保存在文件中的調試信息並以C語言
的語法顯示出來。僅僅支持某些類型的調試信息。
--disassemble
-d 反彙編那些含有指令機器碼的section
--disassemble-all
-D 與 -d 相似,但反彙編全部section
--prefix-addresses
反彙編的時候,顯示每一行的完整地址。這是一種比較老的反彙編格式。
顯示效果並不理想,但可能會用到其中的某些顯示,本身能夠對比。
--disassemble-zeroes
通常反彙編輸出將省略大塊的零,該選項使得這些零塊也被反彙編。
-EB
-EL
--endian={big|little}
這個選項將影響反彙編出來的指令。
little-endian就是咱們當年在dos下玩彙編的時候常說的高位在高地址,
x86都是這種。
--file-headers
-f 顯示objfile中每一個文件的總體頭部摘要信息。
--section-headers
--headers
-h 顯示目標文件各個section的頭部摘要信息。
--help 簡短的幫助信息。
--info
-i 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表。
--section=name
-j name 僅僅顯示指定section的信息
--line-numbers
-l 用文件名和行號標註相應的目標代碼,僅僅和-d、-D或者-r一塊兒使用
使用-ld和使用-d的區別不是很大,在源碼級調試的時候有用,要求
編譯時使用了-g之類的調試編譯選項。
--architecture=machine
-m machine
指定反彙編目標文件時使用的架構,當待反彙編文件自己沒有描述
架構信息的時候(好比S-records),這個選項頗有用。能夠用-i選項
列出這裏可以指定的架構
--reloc
-r 顯示文件的重定位入口。若是和-d或者-D一塊兒使用,重定位部分以反匯
編後的格式顯示出來。
--dynamic-reloc
-R 顯示文件的動態重定位入口,僅僅對於動態目標文件有意義,好比某些
共享庫。
--full-contents
-s 顯示指定section的完整內容。
objdump --section=.text -s inet.o | more
--source
-S 儘量反彙編出源代碼,尤爲當編譯的時候指定了-g這種調試參數時,
效果比較明顯。隱含了-d參數。
--show-raw-insn
反彙編的時候,顯示每條彙編指令對應的機器碼,除非指定了
--prefix-addresses,這將是缺省選項。
--no-show-raw-insn
反彙編時,不顯示彙編指令的機器碼,這是指定 --prefix-addresses
選項時的缺省設置。
--stabs
Display the contents of the .stab, .stab.index, and
.stab.excl sections from an ELF file. This is only
useful on systems (such as Solaris 2.0) in which
.stab debugging symbol-table entries are carried in
an ELF section. In most other file formats, debug-
ging symbol-table entries are interleaved with
linkage symbols, and are visible in the --syms output.
--start-address=address
從指定地址開始顯示數據,該選項影響-d、-r和-s選項的輸出。
--stop-address=address
顯示數據直到指定地址爲止,該選項影響-d、-r和-s選項的輸出。
--syms
-t 顯示文件的符號表入口。相似於nm提供的信息
--dynamic-syms
-T 顯示文件的動態符號表入口,僅僅對動態目標文件有意義,好比某些
共享庫。它顯示的信息相似於 nm -D|--dynamic 顯示的信息。
--version 版本信息
objdump --version
--all-headers
-x 顯示全部可用的頭信息,包括符號表、重定位入口。-x 等價於
-a -f -h -r -t 同時指定。
objdump -x inet.o
objcopy 基本用法
objcopy把一種目標文件中的內容複製到另外一種類型的目標文件中.
(1)將圖像編譯到可執行文件內
Q: 如何將一個二進制文件,好比圖片,詞典一類的東西作爲.o文件,直接連接到可執行文件內部呢?
A:
$ objcopy -I binary -O elf32-i386 -B i386 14_95_13.jpg image.o
$ gcc image.o tt.o -o tt
$ nm tt | grep 14_95
0805d6c7 D _binary_14_95_13_jpg_end
00014213 A _binary_14_95_13_jpg_size
080494b4 D _binary_14_95_13_jpg_start
(2)使用objcopy把不用的信息去掉:
$ objcopy -R .comment -R .note halo halo.min
(3)
$ objcopy -R .note -R .comment -S -O binary xyb xyb.bin
-R .note -R .comment 表示移掉 .note 與 .comment 段
-S 表示移出全部的標誌及重定位信息
-O binary xyb xyb.bin 表示由xyb生成二進制文件xyb.bin
objcopy工具使用指南
objcopy Utility
objcopy [ -F bfdname | --target=bfdname ]
[ -I bfdname | --input-target=bfdname ]
[ -O bfdname | --output-target= bfdname ]
[ -S | --strip-all ] [ -g | --strip-debug ]
[ -K symbolname | --keep-symbol= symbolname ]
[ -N symbolname | --strip-symbol= symbolname ]
[ -L symbolname | --localize-symbol= symbolname ]
[ -W symbolname | --weaken-symbol= symbolname ]
[ -x | --discard-all ] [ -X | --discard-locals ]
[ -b byte | --byte= byte ]
[ -i interleave | --interleave= interleave ]
[ -R sectionname | --remove-section= sectionname ]
[ -p | --preserve-dates ] [ --debugging ]
[ --gap-fill= val ] [ --pad-to= address ]
[ --set-start= val ] [ --adjust-start= incr ]
[ --change-address= incr ]
[ --change-section-address= section{=,+,-} val ]
[ --change-warnings ] [ --no-change-warnings ]
[ --set-section-flags= section= flags ]
[ --add-section= sectionname= filename ]
[ --change-leading char ] [--remove-leading-char ]
[ --weaken ]
[ -v | --verbose ] [ -V | --version ] [ --help ]
input-file [ outfile ]
GNU 實用工具程序objcopy的做用是拷貝一個目標文件的內容到另外一個目標文件中。Objcopy使用GNU BFD庫去讀或寫目標文件。Objcopy可使用不一樣於源目標文件的格式來寫目的目標文件(也便是說能夠將一種格式的目標文件轉換成另外一種格式的目標文 件)。經過以上命令行選項能夠控制Objcopy的具體操做。
Objcopy在進行目標文件的轉換時,將生成一個臨時文件,轉換完成後就將這個臨 時文件刪掉。Objcopy使用BFD作轉換工做。若是沒有明確地格式要求,則Objcopy將訪問全部在BFD庫中已經描述了的而且它能夠識別的格式, 請參見《GNUpro Decelopment Tools》中「using ld」一章中「BFD庫」部分和「BFD庫中規範的目標文件格式」部分。
經過使用srec做爲輸出目標(使用命令行選項-o srec),Objcopy能夠產生S記錄格式文件。
通 過使用binary做爲輸出目標(使用命令行選項-o binary),Objcopy能夠產生原始的二進制文件。使用Objcopy產生一個原始的二進制文件,實質上是進行了一回輸入目標文件內容的內存轉 儲。全部的符號和重定位信息都將被丟棄。內存轉儲起始於輸入目標文件中那些將要拷貝到輸出目標文件去的部分的最小虛地址處。
使用Objcopy生成S記錄格式文件或者原始的二進制文件的過程當中,-S選項和-R選項可能會比較有用。-S選項是用來刪掉包含調試信息的部分,-R選項是用來刪掉包含了二進制文件不須要的內容的那些部分。
input-file
outfile
參 數input-file和outfile分別表示輸入目標文件(源目標文件)和輸出目標文件(目的目標文件)。若是在命令行中沒有明確地指定 outfile,那麼Objcopy將建立一個臨時文件來存放目標結果,而後使用input-file的名字來重命名這個臨時文件(這時候,原來的 input-file將被覆蓋)。
-I bfdname
--input-target=bfdname
明確告訴Objcopy,源文件的格式是什麼,bfdname是BFD庫中描述的標準格式名。這樣作要比「讓Objcopy本身去分析源文件的格式,而後去和BFD中描述的各類格式比較,經過而得知源文件的目標格式名」的方法要高效得多。
-O bfdname
--output-target= bfdname
使用指定的格式來寫輸出文件(即目標文件),bfdname是BFD庫中描述的標準格式名。
-F bfdname
--target= bfdname
明確告訴Objcopy,源文件的格式是什麼,同時也使用這個格式來寫輸出文件(即目標文件),也就是說將源目標文件中的內容拷貝到目的目標文件的過程當中,只進行拷貝不作格式轉換,源目標文件是什麼格式,目的目標文件就是什麼格式。
-R sectionname
--remove-section= sectionname
從輸出文件中刪掉全部名爲sectionname的段。這個選項能夠屢次使用。
注意:不恰當地使用這個選項可能會致使輸出文件不可用。
-S
--strip-all (strip 剝去、剝)
不從源文件中拷貝重定位信息和符號信息到輸出文件(目的文件)中去。
-g
--strip-debug
不從源文件中拷貝調試符號到輸出文件(目的文件)中去。
--strip-undeeded
剝去全部在重定位處理時所不須要的符號。
-K symbolname
--keep-symbol= symbolname
僅從源文件中拷貝名爲symbolname的符號。這個選項能夠屢次使用。
-N symbolname
--strip-symbol= symbolname
不從源文件中拷貝名爲symbolname的符號。這個選項能夠屢次使用。它能夠和其餘的strip選項聯合起來使用(除了-K symbolname | --keep-symbol= symbolname外)。
-L symbolname
--localize-symbol= symbolname
使名爲symbolname的符號在文件內局部化,以便該符號在該文件外部是不可見的。這個選項能夠屢次使用。
-W symbolname
-weaken-symbol= symbolname
弱化名爲symbolname的符號。這個選項能夠屢次使用。
-x
--discard-all (discard 丟棄、拋棄)
不從源文件中拷貝非全局符號。
-X
--discard-locals
不從源文件中拷貝又編譯器生成的局部符號(這些符號一般是L或 . 開頭的)。
-b byte
--byte= byte
Keep only every byte th byte of the input file (header data is not affected). byte can be
in the range from 0 to interleave-1, where interleave is given by the -i or
--interleave option, or the default of 4. This option is useful for creating files to
program ROM . It is typically used with an srec output target.
-i interleave
--interleave= interleave (interleave 隔行、交叉)
Only copy one out of every interleave bytes. Select which byte to copy with the
-b or --byte option. The default is 4. objcopy ignores this option if you do not
specify either -b or --byte.
-p
--preserve-dates (preserve 保存、保持)
設置輸出文件的訪問和修改日期和輸入文件相同。
[ --debugging ]
若是可能的話,轉換調試信息。由於只有特定的調試格式被支持,以及這個轉換過程要耗費必定的時間,因此這個選項不是默認的。
--gap-fill= val
使用內容val填充段與段之間的空隙。經過增長段的大小,在地址較低的一段附加空間中填充內容val來完成這一選項的功能。
--pad-to= address
填 充輸出文件到虛擬地址address。經過增長輸出文件中最後一個段的大小,在輸出文件中最後一段的末尾和address之間的這段附加空間中,用 --gap-fill= val選項中指定的內容val來填充(默認內容是0,即沒有使用--gap-fill= val選項的狀況下)。
--set-start= val
設置新文件(應該是輸出文件吧?)的起始地址爲val。不是全部的目標文件格式都支持設置起始地址。
--change-start = incr
--adjust-start= incr
經過增長值incr來改變起始地址。不是全部的目標文件格式都支持設置起始地址。
--change-addresses incr
--adjust-vma incr
Change the VMA and LMA addresses of all sections, section., as well as the
start address, by adding incr. Some object file formats do not permit section
addresses to be changed arbitrarily.
經過加上一個值incr,改變全部段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址),以及起始地址。某些目標文件格式不容許隨便更改段的地址。
--change-section-address section{=,+,-} val
--adjust-section-vma section{=,+,-} val
設 置或者改變名爲section的段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)。若是這個選項中使用的是「=」,那麼名爲section的段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)將被設置成val;若是這個選項中使用的是「-」或者「+」,那麼上述兩個地址將被設置或者改變成這兩個地址的當前值減去或加上 val後的值。若是在輸入文件中名爲section的段不存在,那麼Objcopy將發出一個警告,除非--no-change-warnings選項被 使用。
這裏的段地址設置和改變都是輸出文件中的段相對於輸入文件中的段而言的。例如:
(1)--change-section-address .text = 10000
這裏是指將輸入文件(即源文件)中名爲.text的段拷貝到輸出文件中後,輸出文件中的.text段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)將都被設置成10000。
(2)--change-section-address .text + 100
這 裏是指將輸入文件(即源文件)中名爲.text的段拷貝到輸出文件中後,輸出文件中的.text段的VMA(Virtual Memory Address運行時地址)和LMA(Load Memory Address裝載地址)將都被設置成之前輸入文件中.text段的地址(當前地址)加上100後的值。
--change-section-lma section{=,+,-} val
僅 設置或者改變名爲section的段的LMA(Load Memory Address裝載地址)。一個段的LMA是程序被加載時,該段將被加載到的一段內存空間的首地址。一般LMA和VMA(Virtual Memory Address運行時地址)是相同的,可是在某些系統中,特別是在那些程序放在ROM的系統中,LMA和VMA是不相同的。若是這個選項中使用的是 「=」,那麼名爲section的段的LMA(Load Memory Address裝載地址)將被設置成val;若是這個選項中使用的是「-」或者「+」,那麼LMA將被設置或者改變成這兩個地址的當前值減去或加上val 後的值。若是在輸入文件中名爲section的段不存在,那麼Objcopy將發出一個警告,除非--no-change-warnings選項被使用。
--change-section-vma section{=,+,-} val
僅 設置或者改變名爲section的段的VMA(Load Memory Address裝載地址)。一個段的VMA是程序運行時,該段的定位地址。一般VMA和LMA(Virtual Memory Address運行時地址)是相同的,可是在某些系統中,特別是在那些程序放在ROM的系統中,LMA和VMA是不相同的。若是這個選項中使用的是 「=」,那麼名爲section的段的LMA(Load Memory Address裝載地址)將被設置成val;若是這個選項中使用的是「-」或者「+」,那麼LMA將被設置或者改變成這兩個地址的當前值減去或加上val 後的值。若是在輸入文件中名爲section的段不存在,那麼Objcopy將發出一個警告,除非--no-change-warnings選項被使用。
--change-warnings
--adjust-warnings
如 果命令行中使用了--change-section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,而且輸入文件中名爲section的段不存在,則Objcopy發出警告。這是默認的選項。
--no-chagne-warnings
--no-adjust-warnings
如 果命令行中使用了--change-section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,即便輸入文件中名爲section的段不存在, Objcopy也不會發出警告。
--set-section-flags section=flags
爲爲section的段設置一個標識。這個flags變量的能夠取逗號分隔的多個標識名字符串(這些標識名字符串是可以被Objcopy程序所識別的),合法的標識名有alloc,load,readonly,code,data和rom。
You can set the contents flag for a section which does not havecontents, but it is not meaningful to clear the contents flag of a section which does have contents; just remove the section instead. Not all flags are meaningful for all object file formats.
--add-section sectionname=filename
進 行目標文件拷貝的過程當中,在輸出文件中增長一個名爲sectionname的新段。這個新增長的段的內容從文件filename獲得。這個新增長的段的大 小就是這個文件filename的大小。只要輸出文件的格式容許該文件的段能夠有任意的段名(段名不是標準的,固定的),這個選項才能使用。
--change-leading-char
Some object file formats use special characters at the start of symbols. The most
common such character is underscore, which compilers often add before every
symbol. This option tells objcopy to change the leading character of every
symbol when it converts between object file formats. If the object file formats use
the same leading character, this option has no effect. Otherwise, it will add a
character, or remove a character, or change a character, as appropriate.
--remove-leading-char
If the first character of a global symbol is a special symbol leading character used
by the object file format, remove the character. The most common symbol leading
character is underscore. This option will remove a leading underscore from all
global symbols. This can be useful if you want to link together objects of different
file formats with different conventions for symbol names.
--weaken
Change all global symbols in the file to be weak. This can be useful when building
an object that will be linked against other objects using the -R option to the linker.
This option is only effective when using an object file format that supports weak
symbols.
-V
--version
Show the version number of objcopy.
-v
--verbose
Verbose output: list all object files modified. In the case of archives, objcopy -V
lists all members of the archive.
--help
Show a summary of the options to objcopy.
readelf基本用法
readelf 負責顯示ELF文件的信息 Usage: readelf <option(s)> elf-file(s) Display information about the contents of ELF format files Options are: -a --all 所有 Equivalent to: -h -l -S -s -r -d -V -A -I -h --file-header 文件頭 Display the ELF file header -l --program-headers 程序 Display the program headers --segments An alias for --program-headers -S --section-headers 段頭 Display the sections' header --sections An alias for --section-headers -e --headers 所有頭 Equivalent to: -h -l -S -s --syms 符號表 Display the symbol table --symbols An alias for --syms -n --notes 內核註釋 Display the core notes (if present) -r --relocs 重定位 Display the relocations (if present) -u --unwind Display the unwind info (if present) -d --dynamic 動態段 Display the dynamic segment (if present) -V --version-info 版本 Display the version sections (if present) -A --arch-specific CPU構架 Display architecture specific information (if any). -D --use-dynamic 動態段 Use the dynamic section info when displaying symbols -x --hex-dump=<number> 顯示 段內內容Dump the contents of section <number> -w[liaprmfFso] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc] 顯示DWARF2調試段內容 Display the contents of DWARF2 debug sections -I --histogram Di