zoukankan      html  css  js  c++  java
  • [原创]linux简单之美(二)

    原文链接:linux简单之美(二)

    我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事:

     1 section .data
     2     ft db "now is %d",10
     3 
     4 section .text
     5 extern puts
     6 extern exit
     7 extern sleep
     8 extern printf
     9 global main
    10 
    11 main:
    12     mov edi,11
    13 again:    
    14     dec edi
    15     push edi
    16     push ft
    17     call printf
    18     
    19     push 1
    20     call sleep
    21     
    22     cmp edi,0
    23     jnz again
    24 
    25     push msg
    26     call puts
    27     
    28     push 0
    29     call exit
    30     
    31 msg:
    32  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

  • 相关阅读:
    线程
    进程2
    进程
    socketserver
    黏包
    初始网络编程
    模块
    super
    mro c3算法
    日志固定格式
  • 原文地址:https://www.cnblogs.com/hopy/p/3830293.html
Copyright © 2011-2022 走看看