免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2495 | 回复: 3
打印 上一主题 下一主题

自己编写可启动扇区程序问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-27 15:47 |只看该作者 |倒序浏览
目的:制作可启动的软盘镜像使运行于虚拟机中

boot.S程序:
.code16 #使用16位模式汇编
.text #代码段开始
mov %cs,%ax
mov %ax,%ds
mov %ax,%es
call DispStr #调用显示字符串例程
jmp . #无限循环
DispStr:
mov $BootMessage, %ax
mov %ax,%bp #ES:BP = 串地址
mov $16,%cx #CX = 串长度
mov $0x1301,%ax #AH = 13, AL = 01h
mov $0x00c,%bx #页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
mov $0,%dl
int $0x10 #10h 号中断
ret
BootMessage:.ascii "Hello, OS world!"
.org 510 #填充到~510~字节处
.word 0xaa55 #结束标志

solrex_x86.ld程序:
SECTIONS {
. = 0x7c00;
.text :
        {
_ftext = .; //程序将被加载到内存的7c00处
        } = 0
}

Makefile:
CC=gcc
LD=ld
LDFILE=solrex_x86.ld #使用上面提供的连接脚本solrex_x86.ld
OBJCOPY=objcopy
all: boot.img

#Step 1: gcc 调用as 将boot.S 编译成目标文件boot.o
boot.o: boot.S
        $(CC) -c boot.S

# Step 2: ld 调用连接脚本solrex_x86.ld 将boot.o 连接成可执行文件boot.elf
boot.elf: boot.o
        $(LD) boot.o -o boot.elf -e c -T $(LDFILE)

# Step 3: objcopy 移除boot.elf 中没有用的section(.pdr,.comment,.note),
# strip 掉所有符号信息,输出为二进制文件boot.bin 。
boot.bin : boot.elf
        @$(OBJCOPY) -R .pdr -R .comment -R.note -S -O binary boot.elf boot.bin

# Step 4: 生成可启动软盘镜像。
boot.img: boot.bin
        @dd if=boot.bin of=boot.img bs=512 count=1 #用boot.bin 生成镜像文件第一个扇区
# 在bin 生成的镜像文件后补上空白,最后成为合适大小的软盘镜像
        @dd if=/dev/zero of=boot.img skip=1 seek=1 bs=512 count=2879
clean:
        @rm -rf boot.o boot.elf boot.bin boot.img
上述三个文件保存在一个目录下,执行make:
#make
问题:屏幕输出如下,请问是什么原因
ld boot.o -o boot.elf -e c -T solrex_x86.ld
*** buffer overflow detected ***: ld terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x4[0x4022e558]
/lib/tls/i686/cmov/libc.so.6[0x4022c680]
/lib/tls/i686/cmov/libc.so.6[0x4022bd68]
/lib/tls/i686/cmov/libc.so.6(_IO_default_xsputn+0xc[0x401a1a18]
/lib/tls/i686/cmov/libc.so.6(_IO_vfprintf+0xf4a)[0x401748da]
/lib/tls/i686/cmov/libc.so.6(__vsprintf_chk+0xa7)[0x4022be17]
/lib/tls/i686/cmov/libc.so.6(__sprintf_chk+0x2d)[0x4022bd5d]
ld[0x804e9b0]
ld[0x804f71c]
ld[0x804ba63]
ld[0x80513e4]
ld[0x805fba7]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0x4014a685]
ld[0x804b101]
======= Memory map: ========
08048000-080b3000 r-xp 00000000 08:07 475748     /usr/bin/ld
080b3000-080b4000 r--p 0006b000 08:07 475748     /usr/bin/ld
080b4000-080b5000 rw-p 0006c000 08:07 475748     /usr/bin/ld
080b5000-080b6000 rw-p 080b5000 00:00 0
08fef000-09010000 rw-p 08fef000 00:00 0          [heap]
40000000-4001a000 r-xp 00000000 08:07 3563539    /lib/ld-2.8.90.so
4001a000-4001b000 r-xp 4001a000 00:00 0          [vdso]
4001b000-4001c000 r--p 0001a000 08:07 3563539    /lib/ld-2.8.90.so
4001c000-4001d000 rw-p 0001b000 08:07 3563539    /lib/ld-2.8.90.so
4001d000-40020000 rw-p 4001d000 00:00 0
40020000-4002d000 r-xp 00000000 08:07 3564060    /lib/libgcc_s.so.1
4002d000-4002e000 r--p 0000c000 08:07 3564060    /lib/libgcc_s.so.1
4002e000-4002f000 rw-p 0000d000 08:07 3564060    /lib/libgcc_s.so.1
40032000-4010e000 r-xp 00000000 08:07 476857     /usr/lib/libbfd-2.18.93.20081009.so
4010e000-40118000 r--p 000dc000 08:07 476857     /usr/lib/libbfd-2.18.93.20081009.so
40118000-4011a000 rw-p 000e6000 08:07 476857     /usr/lib/libbfd-2.18.93.20081009.so
4011a000-4011e000 rw-p 4011a000 00:00 0
4011e000-40132000 r-xp 00000000 08:07 477725     /usr/lib/libz.so.1.2.3.3
40132000-40134000 rw-p 00013000 08:07 477725     /usr/lib/libz.so.1.2.3.3
40134000-4028c000 r-xp 00000000 08:07 3580927    /lib/tls/i686/cmov/libc-2.8.90.so
4028c000-4028e000 r--p 00158000 08:07 3580927    /lib/tls/i686/cmov/libc-2.8.90.so
4028e000-4028f000 rw-p 0015a000 08:07 3580927    /lib/tls/i686/cmov/libc-2.8.90.so
4028f000-40293000 rw-p 4028f000 00:00 0
bf8d1000-bf8e6000 rw-p bffeb000 00:00 0          [stack]
make: *** [boot.elf] Aborted

论坛徽章:
0
2 [报告]
发表于 2010-09-27 16:51 |只看该作者
最近也编译了下Bootsect玩玩, 不过不会楼主写的makefile

as -o bootsect.o bootsect.s

ld --oformat binary -Ttext 0x7c00 -e _start -o boot.bin bootsect.o

详情参照 ld --help

论坛徽章:
0
3 [报告]
发表于 2010-09-27 20:49 |只看该作者
本帖最后由 PCliangtao 于 2010-09-27 20:52 编辑

.text :
        {
_ftext = .; //程序将被加载到内存的7c00处
        } = 0
}

.text 段中会包括什么呢?

.=0x7c00 接着就是 .text。  这样并不代表程序会被加载到0x7c00处。 而是指程序中的符号基址从0x7c00开始...

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
4 [报告]
发表于 2010-09-30 13:10 |只看该作者
链接的时候要指定不加标准库,-nostdlib。可以直接用GCC前端,通过-Wl向链接器传参数。

gcc -o boot bootsect.s -nostdlib -Wl,-Ttext,0x7C00

然后再把代码剥出来。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP