1.最后生成u-boot的過程
以下是u-boot Makefile最后連接生成u-boot的過程
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/EmbedSky/libEmbedSky.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/jffs2/libjffs2.a net/libnet.a rtc/librtc.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/lcd/liblcd.a modules/usb.module modules/wince.module common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /root/embed/opt/EmbedSky/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /root/embed/opt/EmbedSky/u-boot-1.1.6/board/EmbedSky/u-boot.lds -Ttext 0x33D80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/EmbedSky/libEmbedSky.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/jffs2/libjffs2.a net/libnet.a rtc/librtc.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/lcd/liblcd.a modules/usb.module modules/wince.module common/libcommon.a --end-group -L /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot
a. UNDEF_SYM的作用
用objdump -x 列出所有庫的頭
用sed 將 __u_boot_cmd_.* 替換成 -u__u_boot_cmd_.*
sort| uniq 去掉重復的部分
所以執行后 UNDEF_SYM=
-u__u_boot_cmd_autoscr
…...
-u__u_boot_cmd_test_zImage
-u__u_boot_cmd_tftpboot
-u__u_boot_cmd_usbslave
b. arm-linux-ld -Tu-boot.lds -Ttext 0x33D80000
u-boot.lds 中有如下:
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/EmbedSky/boot_init.o (.text)
*(.text)
}
b.1雖然 u-boot.lds 是從0x00000000 開始,但是這兒明確的指定了 -Ttext 0x33D80000, 所以生成的u-boot的代碼段是從0x33D80000開始的。
b.2 另外 UNDEF_SYM中的一系列的 -u__u_boot_cmd_.*提供給ld
但是還有一點不太明白的就是,為什么要這樣做?
參考了這篇文章,對crifan的崇拜有如滔滔江水......
http://www.crifan.com/2010/02/27/detailed_analysis_of_the_make_uboot_final_compile_and_link_the_implementation_process/
以下引自crifan的《詳細分析make uboot 最后的編譯鏈接的具體執行過程 v2012-03-29》
“-u symname
——————————
Enter symname as an undefined symbol in the symbol table. This is useful for loading entirely from an archive library, since initially the symbol table is empty, and an unresolved reference is needed to force the loading of the first routine. The placement of this option on the command line is significant; it must be placed before the library that will define the symbol.
—————————————————————————————————————-
總的意思,就是,在ld的時候,不定義,這些符號,即不定義__u_boot_cmd_asdebug,__u_boot_cmd_base等等這些符號,我的理解是,因為開始需要從某個庫中載入其他的符號,而這個時候,還沒有載入到那個包含此符號定義的庫,所以,暫時先加入這個-u說明,先不定義這些符號,等到所有的庫都加載完了,再去找這些符號的定義,此時已經加載完所有的庫了,也就能找到這些符號的定義了。
(F)接下來的,就是要ld的,那一堆的目標文件,庫文件了:
cpu/arm926ejs/start.o和
–start-group lib_generic/libgeneric.a lib_generic/lzma/liblzma.a cpu/arm926ejs/libarm926ejs.a 。。。。。。 post/libpost.a board/ams/as3536/libas3536.a –end-group
關于–start-group和 –end-group的含義:
-(archives)或者—start-group archives –end-group 參數中間的目標文件會被ld反復搜索,對相互交叉引用的目標文件很有用
所以,我的理解是,如果ld載入了一個庫,發現該庫中,有UNDF,未被定義的變量,有了這個參數的指示后,就會在這一堆.a和.o文件里面反復搜索,直至找到為止,否則,如果在已經加載的庫中,找不到,就會報錯。”
關于”–start-group和 –end-group”,又去找了相關資料:
Linker order – GCC
GCC: –start-group and –end-group command line options
得知確切的含義是:
鏈接器LD去load對應的庫(lib,module)的時候,可能會遇到這些情況:
(1)A庫,引用了B庫中funcInB(),但是先ld A庫,導致找不到對應的funInB而鏈接報錯
(2)A庫和B庫,互相都包含對應所引用到的函數,即互相引用/循環引用,ld編譯器會因為找不到A庫中所引用的B庫的中的函數(或者反過來B庫引用A庫中的函數)而報錯。
此時,用”–start-group和 –end-group“,通知ld鏈接器,去在–start-group和–end-group中間的這些庫函數,多花點時間,對于這些庫,都從頭到尾,多查幾遍,去找找那些還沒有找到的所引用的函數,是不是在另外的庫中有這些函數,以此解決:
(1)A庫引用到了后來才加載的B庫中的函數
(2)解決循環引用
之類的問題。
上一篇:TQ2440之uboot---5.jlink 在線調試 u-boot
下一篇:TQ2440之uboot---3.make EmbedSky_config
推薦閱讀
史海拾趣
近年來,Freeport Resources緊跟時代步伐,積極推進數字化轉型和智能化升級。公司引入了先進的信息化管理系統和智能化生產設備,實現了從礦產勘探、開采到加工、銷售的全鏈條數字化管理。通過數字化轉型和智能化升級,Freeport Resources大幅提高了生產效率和產品質量,降低了運營成本。同時,公司還利用大數據和人工智能技術優化供應鏈管理和市場預測,為公司的戰略決策提供有力支持。
需要注意的是,以上故事是基于Freeport Resources可能的業務范圍和行業趨勢虛構的,旨在展示一個礦業公司在向電子行業轉型過程中可能經歷的發展歷程。由于直接針對Freeport Resources在電子行業中的具體故事較為有限,因此這些故事可能并不完全準確反映該公司的實際情況。
在追求業務發展的同時,Holy Stone始終注重品質提升和環境管理。公司陸續通過了ISO9001、ISO14001、QS9000、ISO/TS16949等國際認證,確保了產品的高品質和環保性。這些認證不僅提升了公司的品牌形象和市場競爭力,還為客戶提供了更加可靠的產品和服務。此外,公司還積極履行社會責任,在環境治理、社會參與等方面做出了具體貢獻。
近年來,Holy Stone不斷加大在技術研發和產品創新方面的投入。公司致力于研發適用于節能產品應用所需的被動元件,幫助客戶提升產品能源轉換效率。在全球汽車電子化發展的背景下,Holy Stone正式跨入車用電子供應鏈,以提供優質元件的能力協助汽車電子達到最佳數位化。這些技術創新不僅推動了公司產品的升級換代,還為公司開拓了新的市場領域和增長點。
以上五個故事展示了Holy Stone公司在電子行業中的發展歷程和成就,每個故事都體現了公司在不同方面的努力和成果。
1991年,加州大學洛杉磯分校的工程學教授亨利·山繆利和他的博士班學生亨利·尼古拉斯,以各出資5000美元的方式,在美國加州爾灣小鎮共同創立了博通公司。初創時期,博通主要致力于開發機頂盒的寬帶通信芯片。隨著技術的不斷進步和市場需求的增長,博通的產品逐漸受到業界的認可,銷售額穩步上升。
在E. Dold & S?hne KG公司的發展歷程中,品質始終是公司最重視的方面之一。公司嚴格把控原材料采購、生產過程和產品檢驗等環節,確保每一件產品都符合高標準的質量要求。這種對品質的執著追求使得E. Dold & S?hne KG公司的產品在市場上贏得了廣泛的認可和信任。
為了更快地拓展市場,聚洵半導體積極尋求與國內外知名企業的合作。公司與世界領先的芯片制造公司臺積電建立了晶圓代工合作關系,并在長電科技和華天科技進行封裝測試,確保了產品的一流工藝和品質。此外,聚洵還與國內多家電子元器件電商平臺如立創商城、華強芯城等建立了緊密的合作關系,通過線上線下雙管齊下的分銷渠道,將產品迅速推向市場。這些合作不僅提升了聚洵的品牌知名度,還極大地促進了其市場份額的增長。
編譯內核時出錯: scripts/kallsyms: /lib/tls/libc.so.6: version `GLIBC_2.4\' not found (required by scripts/kallsyms) make: *** [.tmp_kallsyms1.S] Error 1 請球高手解答!!謝謝… 查看全部問答∨ |
|
最近要把原來寫過的IDE接口的硬盤讀寫程序改成SATA的,用到1F0~1F7和3F6~3F7這些I/O映射地址對硬盤控制芯片的寄存器進行尋址,現在我需要知道用SATA接口時,這些I/O地址應該是什么,只要知道對SATA操作的I/O端口地址就能解決所有問題了,請 ...… 查看全部問答∨ |
高級軟件工程師 職責: 系統底層軟件的開發; 參與系統需求分析和設計; 職位要求: 1.要求本科以上的計算機相關專業,有豐富開發經驗; 2.三年以上的軟件開發經驗,良好的軟件編程習慣; 3.具有兩年以上的系統內核程序的開發經驗,熟 ...… 查看全部問答∨ |
本人初學wince,請教大蝦們一個問題。 本人使用的是S3c2440,wince5.0,800x600的LCD。 因為屏幕過大,wince的顯示看起來已經較慢。 因為客戶的要求,開發軟件需要保持與pc機版本的界面一致。導致程序中需要在一個界面上繪制上百個控件,可以看 ...… 查看全部問答∨ |
|
原理圖中CC2530很多引腳都是連接到插座上,想請教下這些插座的作用以及插座上幾個焊盤接gnd或者VCC的原因。另外一個問題就是可不可以改變插座引腳的位置以更方便自己PCB布局。我畫的是2層板布局。… 查看全部問答∨ |