MinGW 编译平二进制文件
MinGW 是 gcc 的 Win32 移植,所以编译平二进制文件的方式相同。
首先 gcc -c foo.c
然后 ld -Ttext=0x8000 -o foo.exe foo.o
最后 objcopy foo.exe foo.bin
值得注意的是 foo.c 不能使用主函数 main 作为程序入口,否则 MinGW 会根据 Win32 特性增加 Startup 代码,这时会需要 _main 和 alloc 内部函数支持。而链接入口函数 mainCRTStartup 只能放在代码最开始处,前面不能有其他全局变量声明,不然 objcopy 的时候,平二进制文件开头处是全局变量而不是入口函数指定代码。同样链接入口函数调用程序入口函数前面也不要声明函数内部的静态变量。
关于 text=0x8000,对于 ANOS 原先准备载入内核到 0x10000 处。结果编译时,进保护模式代码放在 start.asm 汇编中,其间使用了 16 位代码,而且代码中引用地址(GDT 表)。如果代码段定位在 0x10000 处,不在 16 位实模式的第一个 64K 段上。这时,编译好的 start.o 里面的 16 位代码中的引用地址无法定位(段?)。所以最终还是使用了内存地址 0x8000 来定位内核。
另:C 程序中的函数在实际编译的时候名字前会添加一个下划线,即在 asm 中使用 mainCRTStartup 应该实 _mainCRTStartup。
发表评论