一直以為把 init .bss section 搞定了, 結果那段 code 有很大的問題。
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 帳號。