The latest issue cost me for nearly 5 days or even more.
[ Issue ]
I want to write a bootloader with C language, using gcc & nasm. As known, gcc can only generate ELF format binaries. So I use objcopy to transform the file formats: from ELF to plain text binaries. But some really weird problem happened : the function offset mismatching, unexpected asm instructions...
[ How I solve the problem ]
1. I tried several different parameters for the tools, especially gcc and ld.
2. I digged into the disassembled sources of all the binaries. And then I found key.
3. I found GCC, LD & objcopy all worked OK, while the machine translated the binary by mistakes.
4. Then I searched for Internet: ELF is actually a 32-bit binary format, while bootloader(before entering Protected mode) executes under a 16-bit environment.
[ Solution ]
Before entering the Protected mode, 32-bit GNU tools cannot be used.(as86, ld86 are out of range).
[ Appendix ]
http://www.delorie.com/djgpp/16bit/gcc/
Check this site, a geek has built a 16-bit GCC, not elegantly, though :)