[01:18] <BlueT_> 早
[01:40] <rick__> 早
[01:43] <kyli> 澡
[02:07] <HugoKuo__> 早
[02:29] <BlueT_> 沒想到有人回應 XD
[02:39] <Kandu> rick__: 在 ld script SECTIONS 裡說明下就行    .rodata : { rodata_start = .; /*記錄開始地址*/ *(.rodata); . = rodata_start + 0x12340; /*在末尾設定下當前地址(同時也就指定大小了)*/ }
[03:11] <rick__> Kandu, . = ALIGN(4);
[03:11] <rick__>         .rodata : { *(.rodata) }
[03:11] <rick__>         . = ALIGN(4);
[03:11] <rick__>         .data : { *(.data) }
[03:11] <rick__>         . = ALIGN(4);
[03:11] <rick__>         .got : { *(.got) }
[03:13] <rick__> 我在 u-boot.lds 看到 這個 , 所 以是不是指我可以把  .rodata 那行的 格式換成 有 rodat_start的 格式?
[03:13] <rick__> 會想改這個主要是有時 build 出來的 u-boot 開不了機 
[03:14] <Kandu> rick__: 是啊
[03:14] <rick__> 結果發 現rodata 的 最後一筆資料位址, 比 rodata 的 起始位址加上 length 還大
[03:14] <rick__> 所 以我猜應該 是 rodata 節區爆了
[03:14] <rick__> 那我改看看 :D 謝 謝 
[03:15] <Kandu> rick__: 呃，那不行吧，這樣會出錯
[03:15] <rick__> 另外請教 default 的長度定義是寫在哪啊 ?
[03:16] <rick__> BlueT_, 這証明這裡是有早鳥的 xdd
[03:16] <Kandu> rick__: *(.rodata) 把所有 input file 的 rodata section 都置入 output 過大了，蠻力縮小 rodata section 應該會出錯
[03:19] <rick__> Kandu, 我希望能確保 rodata section 夠大, 
[03:20] <rick__> 在載入kernel前, bootloader 可以用到所有的 記憶體..所以多用些應該沒關係
[03:21] <Kandu> rick__: 哦，那倒是可以。那就在 (.rodata) /*這裡*/ } 寫上  . = . +  要擴大的 size
[03:28] <rick__> 只是我不懂 為什麼我有時加太多 printf() 之後, build 出來的 u-boot 不能開機
[03:29] <rick__> 我以為預設的 lds 應該是會依當時的section 大小去自動調整
[03:36] <Kandu> rick__: 確實是自己調整，大概是你計算 length 的代碼有錯吧
[03:37] <Kandu> 我一般的寫法是
[03:37] <Kandu>     .data :
[03:37] <Kandu>     {
[03:37] <Kandu>         PROVIDE(AddrBegin_data = .);
[03:37] <Kandu>         *(.data)
[03:37] <Kandu>         . = ALIGN(0x1000);
[03:37] <Kandu> 	PROVIDE(AddrEnd_data = .);
[03:37] <Kandu>     }
[03:39] <Kandu> rick__: 然後 宣告 extern void * AddrBegin_data; extern void * AddrEnd_data 然後用 &AddrEnd_data - &AddrBegin_data 這樣就是整個 section 的 size 了
[03:40] <Kandu> rick__: 這樣不管匯入了多少 input file 的 data section 都能自動計算出真正的 size
[03:42] <Kandu> rick__: 按剛說的「發 現rodata 的 最後一筆資料位址, 比 rodata 的 起始位址加上  length 還大」，應該是計算 length(size) 的代碼有問題了
[03:47] <rick__> 請問 ALIGN 是?
[03:51] <Kandu> rick__: 我是自己寫 MM，為了 MM 的 initialization 方便，所以用頁大小(0x1000)對齊，這個沒關係。主要就是在 section 最開頭 PROVIDE 一個 symbol, 最後一個 symbol 方便計算整個 section 的大小
[03:54] <rick__> Kandu, 所以指的是每個 section 起頭都是 0x1000的倍數嗎?
[03:56] <Kandu> rick__: 嗯
[03:57] <Kandu> rick__: 剛有個疏忽 &AddrEnd_data - & AddrBegin_data 要 cast 下 (unsigned int)&a - (unsigned int)&b 這樣  (我不熟 c 語言 :)
[04:01] <rick__> Kandu, 謝謝 :D 我再試看看, 這兩天要先搞 hardware ecc 跟 ubifs 的事...一直 ecc fail QQ
[04:04] <Kandu> rick__: XD 若有空，讀下 ld manual 應會不錯 http://sourceware.org/binutils/docs/ld/
[04:54] <rick__> Kandu, 感謝 :D
[05:42] <Guest69438> asd