最小的可执行文件

Posted lishizhen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小的可执行文件相关的知识,希望对你有一定的参考价值。

在阅读《程序员的自我修养--链接装载与库》的第四章 ==静态链接== 4.6.2==最小的程序==时,发现代码是基于linux32位系统的程序,无法在64位系统上编译和运行。

正确的64位程序应该为

代码

char *str = "Hello world!\n";

void print()
    asm("movq $13,%%rdx \n\t"
        "movq %0,%%rsi \n\t"
        "movq $0,%%rdi \n\t"
        "movq $1,%%rax \n\t"
        "syscall \n\t" 
        ::"r"(str) : "rdx", "rsi", "rdi");


void exit()
    asm("movq $42,%rdi \n\t"
        "movq $60,%rax \n\t"
        "syscall \n\t");


void nomain()
    print();
    exit();

运行结果

技术图片

原因

linux系统中64位汇编和32位汇编的系统调用主要有以下不同:

  • 系统调用号不同.比如x86中sys_write是4,sys_exit是1;而x86_64
    sys_write是1, sys_exit是60。linux系统调用号实际上定义在/usr/include/asm/unistd_32.h和/usr/include/asm/unistd_64.h中。
  • 系统调用所使用的寄存器不同,x86_64中使用与eax对应的rax传递系统调用号,但是 >x86_64中分别使用rdi/rsi/rdx传递前三个参数,而不是x86中的ebx/ecx/edx。
  • 系统调用使用“syscall”而不是“int 80”

以上是关于最小的可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

从另一个项目的可执行文件启动一个项目的可执行文件

未找到 GraphViz 的可执行文件 - 为啥通过 pip 安装 graphViz 后没有安装可执行文件?

java的可执行文件jar用java代码执行方法。

如何把ndk编译出来的可执行文件伪装成so打包到apk中

linux当前目录下的可执行文件不能直接执行的原因

是否可以使用 .gitignore 忽略特定的可执行文件?