自制操作系统7:c and asm - 双剑合璧

参考:
https://blog.csdn.net/tyler_download/article/details/52468520
https://www.bilibili.com/video/BV1VJ41157wq?p=7
保护模式寻址32位,4G,C语言运行在保护模式下?(语言和模式关系不大,应该是调用的操作系统函数或者说库)
结合思路:C与asm要能互相调用,这篇文章主要是做实验。
foo.asm,bar.c--好戏foo,bar是c++教材里面经常用的名字,比如C++之父经常用这个名字对。

先建立一个目录:objconv
下载反汇编工具:
git clone https://github.com/vertis/objconv.git
发现git没有,先安装
sudo apt install git
重新运行git,发现很慢,30k/s,国内访问github为啥这么慢呢?最终超时了。
https://github.com/vertis
发现是个人作品,真是厉害。https://github.com/vertis/objconv已经有8年没有更新了。
g++ -o objconv -O2 src/*.cpp
编译失败了
src/coff.cpp:142:1: error: narrowing conversion of ‘2147483648’ from ‘unsigned int’ to ‘int’ [-Wnarrowing]
src/disasm2.cpp:101:1: error: narrowing conversion of ‘2147483648’ from ‘unsigned int’ to ‘int’ [-Wnarrowing]
0x800000--32bit,int是可以的。改代码读了一下,很复杂,不敢修改。google发现有人遇到同样问题
https://www.agner.org/optimize/objconv.zip
解压编译成功了。
foo.asm

bar.c

nasm -f elf32 -o foo.o foo.asm
gcc -m32 -c -o bar.o bar.c
ld -m elf_i386 -o foobar foo.o bar.o
./foobar

gcc -m32 -fno-asynchronous-unwind-tables -s -c -o bar.o bar.c
objconv -fnasm bar.o -o bar.asm

打开foo.asm, 将里面的_start, 修改成main
;extern bar_func;
在foo.asm末尾,通过语句:%include “bar.asm” 
bar.asm删除extern
nasm -f elf32 foo.asm
gcc -m32 foo.o -o foo
出错。
查看论坛:
记录自己出现的问题:反汇编后代码多出__x86.get_pc_thunk.ax函数; 解决办法:先使用gcc -m32 -fno-pie -s -c -o bar.o bar.c命令,再进行反汇编,这样就能与示例代码相同了

gcc -m32 -fno-pie -s -c -o bar.o bar.c
objconv -fnasm bar.o -o bar.asm
nasm -f elf32 foo.asm
gcc -m32 foo.o -o foo
xl@qwq:~/myos/objconv-new/objconv$ gcc -m32 foo.o -o foo
/usr/bin/ld: 找不到 Scrt1.o: 没有那个文件或目录
/usr/bin/ld: 找不到 crti.o: 没有那个文件或目录
/usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a 时跳过不兼容的 -lgcc
/usr/bin/ld: 找不到 -lgcc
/usr/bin/ld: 当搜索用于 /lib/libgcc_s.so.1 时跳过不兼容的 libgcc_s.so.1
/usr/bin/ld: 找不到 libgcc_s.so.1
/usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a 时跳过不兼容的 -lgcc
/usr/bin/ld: 找不到 -lgcc
collect2: error: ld returned 1 exit status

sudo find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o
只有64位的
google了一下,是64 位常见问题,安装一个包就行
sudo apt-get install gcc-multilib
安装后完美解决。这样工具链就准备就绪了。
顺便说一下:google比baidu强很多,文中两个问题都是google的,baidu给不出答案。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值