linux简单之美
Linux 简单 之美
2023-09-11 14:16:04 时间
关键是系统调用号要知道,开始找的是usr/include/asm-gen*/unistd.h,
可是都不对。后来找的是usr/include/x86_64_linux_gnu/asm/下的头文件,
有2个,分别对应x86和x64.、编译连接指令如下:
运行,段转储错误鸟,查了一下,本猫用的是x64位的linux,所以要生成
x64位的程序,或者指明是x86的程序,我选择后者:
ld -m elf_i386 -o main main.o
哦鸟!
我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用
C标准库中的函数快速做一些"复杂"的事:
以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中
调用了C标准库中的函数.编译和以前一样:
nasm -e elf main.asm
我们看看怎么连接:
gcc -m32 -o main main.o
好鸟!运行正常.
值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,如果开始用
ld -m elf_i386 -lc -o main main.o
的方式,首先会提示找不到c库,这可以进入/usr/lib,然后使用
sudo ln -sv /lib/i386-linux-gun/libc.so.6 libc.so
创建软连接解决.
但在运行时提示无法找到可执行文件!该文件明明在的!
遂用gcc来连接,但要将_start改为main,还要装载32库
sudo apt-get install ia32-libs
还会提示找不到h文件,这时再装载库
sudo apt-get install g++-multilib
还有2族库,如有必要也可加载:
最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,
这时改成如下即可:
gcc -D_GNU_SOURCE -std=c99 main.c
在(二)中我们尝试使用了C库的函数完成功能,那么能不能用syscall方式
来搞呢?显然可以!
在代码中延时使用的是nanosleep,其他和第一篇一致,只不过做了一个bin- ascii的小转换.
原文发布时间:2014-06-24
本文来自云栖合作伙伴“linux中国”
Linux的起源 Linx 起源和发展是一段令人着迷的历史。 这里面包含着太多颠覆“常理”的事件和 思想,促成 Linux 成长壮大的“神奇”力量总是被人津津乐道,Linux所创造的传奇有时候让初次接触它的人感到不可思议。
因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人。虽然大家可能都听过钱钟书先生的名言:“假如你吃个鸡蛋觉得味道不错,又何必认识那个下蛋的母鸡呢?” 但是如果真是遇到一个“特别显赫”的鸡蛋,很多人还是想看看能生出这颗神蛋的母鸡的,或者想听听这只母鸡的故事。
相关文章
- linux简单之美(二)
- [Linux] git send-email的使用
- Linux下RAID技术
- 【Linux基础】linux updatedb命令
- 类似linux tail -n的功能如何实现
- 简单区分虚拟主机是linux还是win操作系统
- wsl(Windows Subsystem for Linux)安装简易指南
- linux - ctrl + s 导致锁死 解决
- L57.linux命令每日一练 -- 第九章 Linux进程管理命令 -- ps和pstree
- L34.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- echo和watch
- Docker初步2 - Linux下安装
- Linux如何查看与测试磁盘IO性能
- 【Deepin 20系统】Linux系统安装gcc报错no acceptable C compiler found in $PATH
- Linux添加永久静态路由信息
- Linux 简介