Linux简单之美

(一)

话说windows也有syscall,这是必须的。但是win的syscall可以直接call吗?可以是

可以但是破费周折,搞成SDT之类的复杂概念。下面看看linux是如何做的吧。

关键是系统调用号要知道,开始找的是usr/include/asm-gen*/unistd.h,,

可是都不对。后来找的是usr/include/x86_64_linux_gnu/asm/下的头文件,

有2个,分别对应x86和x64.、编译连接指令如下:

运行,段转储错误鸟,查了一下,本猫用的是x64位的linux,所以要生成

x64位的程序,或者指明是x86的程序,我选择后者:

哦鸟!

(二)

我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用

C标准库中的函数快速做一些”复杂”的事:

以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中

调用了C标准库中的函数.编译和以前一样:

我们看看怎么连接:

好鸟!运行正常.

值得注意的是:我的OS是Ubuntu64,而asm代码中是32位的,如果开始用

的方式,首先会提示找不到c库,这可以进入/usr/lib,然后使用

创建软连接解决.

但在运行时提示无法找到可执行文件!该文件明明在的!

遂用gcc来连接,但要将_start改为main,还要装载32库

还会提示找不到h文件,这时再装载库

还有2族库,如有必要也可加载:

最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,

这时改成如下即可:

更多详情见请继续阅读下一页的精彩内容:

而只有在充满了艰辛的人生旅途中,

Linux简单之美

相关文章:

你感兴趣的文章:

标签云: