2012年8月17日 星期五

bss initialize issue

different g++ version - different global object ctor implementation ~^.^~ g++ 4.4, 4.6, 4.7 最後提到的問題終於解決了。

一直以為把 init .bss section 搞定了, 結果那段 code 有很大的問題。

a.asm
 1 # init bss
 2 init_bss_asm:
 3   movw $__bss_end__, %di    /* Destination */
 4   movw $__bss_start__, %si   /* Source */
 5   movw %ds, %bx
 6   movw %bx, %es
 7   jmp 2f
 8 1:
 9   mov $0, %eax
10   movw %si, %ax
11   movb $0x0, %es:(%eax)
12   add $1, %si
13 
14 
15   # wait key
16 #  xor %eax,%eax
17 #  int $0x16
18 
19 
20 2:
21   cmpw %di, %si
22   jne 1b
23 
24   ret
25 
26 

10   movw %si, %ax
11   movb $0x0, %es:(%eax)

沒有注意到 eax 可能會是 0x1234%si 這樣的值, 單純的以為會是 0x0000%si, 補上
 
 9   mov $0, %eax

就搞定了。好啦!我知道這樣很遜, 有個  movxx 的指令一行就搞定, 就查不到妹 ...

那你可能有疑問? 為什麼不寫成

10   movw %si, %ax
11   movb $0x0, %es:(%ax)

就好了。

因為 gas 不讓這樣的寫法通過。 原因: 不知道。

g++ -static -m32  -g -Wall -Wextra -nostdlib -fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions -fno-rtti -fno-stack-protector -c cpp_init.s
cpp_init.S: Assembler messages:
cpp_init.S:129: Error: `%es:(%ax)' is not a valid base/index expression
make: *** [cpp_init.o] Error 1

不懂 ...

除了使用 linker script 還可以在 ld 命令列指定 bss, data, text 的位址。

man ld
   --section-start=sectionname=org
           Locate a section in the output file at the absolute address given by
           org.  You may use this option as many times as necessary to locate
           multiple sections in the command line.  org must be a single 
           hexadecimal integer; for compatibility with other linkers, 
           you may omit the leading 0x usually associated with 
           hexadecimal values.  Note: there should be no white space 
           between sectionname, the equals sign ("="), and org.
   -Tbss=org
       -Tdata=org
       -Ttext=org
           Same as --section-start, with ".bss", ".data" or ".text" as 
           the sectionname.

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。