linux简单之美(二)
Linux 简单 之美
2023-09-14 08:56:51 时间
我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用
C标准库中的函数快速做一些"复杂"的事:
section .data ft db "now is %d",10 section .text extern puts extern exit extern sleep extern printf global main main: mov edi,11 again: dec edi push edi push ft call printf push 1 call sleep cmp edi,0 jnz again push msg call puts push 0 call exit db "happy xxx day!",0
以上代码功能很简单,从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族库,如有必要也可加载:
sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386
libstdc++5:i386 libstdc++6:i386
sudo apt-get install libc6-i386
最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,
这时改成如下即可:
gcc -D_GNU_SOURCE -std=c99 main.c
相关文章
- 【Linux驱动】linux内核模块简介
- Linux文件系统目录
- [uart]1.Linux中tty框架与uart框架之间的调用关系剖析
- linux(centos8):用cut显示文本内容的指定列
- EasyRTMP实现的一套简单、高效、易用的全平台(Windows/Linux/ARM/Android/iOS)RTMP直播推送库
- 【Linux基础】linux下修改ls显示的时间格式
- linux命令:查看本机IP地址 curl ip.gs
- 第一次玩Linux系统 并执行一条c语言 简单粗暴
- Linux 截图
- Linux makefile 教程 很具体,且易懂
- Linux 内核开发—内核简单介绍
- L78.linux命令每日一练 -- 第11章 Linux系统管理命令 -- iostat和iotop
- L71.linux命令每日一练 -- 第十章 Linux网络管理命令 -- wget和mailq
- L57.linux命令每日一练 -- 第九章 Linux进程管理命令 -- ps和pstree
- L47.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- users和whoami
- L36.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- locate和updatedb
- L1.linux命令每日一练 -- 第一章 Linux命令行简介
- Linux下网站性能压力测试之ab命令
- Linux基础命令-cd切换目录
- linux 简单强大的命令
- Linux tee命令
- 【Deepin 20系统】Linux系统修改MATLAB 打开默认地址(默认工作空间)
- Linux Shell脚本编程基础