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