参考:
https://blog.youkuaiyun.com/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给不出答案。