64位Centos7上汇编运行32位程序
首先贴上源代码。
#文件名test.s
.data
msg: .string "$0-$8=%d\n"
.text
.global _start
_start:
movl $0, %eax
movl $8, %ebx
subl %ebx, %eax
pushl %eax
lea msg, %eax
pushl %eax
call printf
movl $0, %ebx
movl $1, %eax
int $0x80
功能非常简单,就是计算eax减去ebx的值,然后调用c语言printf函数输出(参数列表中的参数逆向压入堆栈,然后“call printf“即可)。
- 汇编
上面的代码采用的是AT&T语法,所以使用GNU as汇编器。命令如下
as –32 -otest.o test.s
关键是–32选项,它告诉汇编器这是32位的程序。否则,默认生成64位的目标文件。 - 链接
在Linux系统中许多软件都会使用彼此提供的函数库来完成特殊的功能。Linux中的函数库分为动态函数库和静态函数库。
静态函数库。这类函数库通常扩展名为libxxx.a。在程序编译的时候会直接被整合到程序中,生成的程序可以独立执行。程序文件通常比较大,当函数库升级时整个程序需要重新编译才能使用新版本的函数库。
动态函数库。这类函数库的扩展名为libxxx.so。在程序编译时候,程序中仅会保留指向函数库的Pointer而已,程序执行时需要函数库时会根据这个Pointer去相应的路径读取。程序文件比较小,函数库升级不需要重新编译程序就可使用新版的函数库(前提是函数库的名称路径不变)。
上面说了这么多,是因为后面碰到的问题与这个概念相关。先用链接命令尝试一下,当然是会报错的。