V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
kaohaonan6666
V2EX  ›  Linux

有大神知道 Linux 下的 ELF 可执行文件 和 Ascii text 可执行文件的区别吗

  •  
  •   kaohaonan6666 · 2018-11-17 10:03:37 +08:00 · 3757 次点击
    这是一个创建于 1985 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我只知道 Ascii text 里面会引入 /bin/bash 这个 ELF 可执行文件 那这两种文件类型的具体区别,各自的利弊,以及 Ascii text 的运行原理 有大神指教下吗

    17 条回复    2018-11-19 17:27:24 +08:00
    wzxlovesy
        1
    wzxlovesy  
       2018-11-17 10:16:14 +08:00 via Android   ❤️ 4
    建议你补习一下计算机常识。
    chih758
        2
    chih758  
       2018-11-17 10:21:32 +08:00
    https://book.douban.com/subject/3652388/
    《程序员的自我修养》
    其中一章 3.4 ELF 文件结构描述
    kaohaonan6666
        3
    kaohaonan6666  
    OP
       2018-11-17 10:28:32 +08:00
    @chih758 刚看到 3.1... 等我看完应该就懂了
    changnet
        4
    changnet  
       2018-11-17 11:39:39 +08:00 via Android
    text 不是可执行文件,是由 bash 解析的
    ysc3839
        5
    ysc3839  
       2018-11-17 12:39:26 +08:00 via Android
    你说的“ Ascii Text ”应该指的是这个 https://en.wikipedia.org/wiki/Shebang_(Unix)
    iRiven
        6
    iRiven  
       2018-11-17 12:41:09 +08:00 via Android
    其实我搞不懂的是为啥 Linux 的 init 进程可以是一个 shell 脚步
    iwtbauh
        7
    iwtbauh  
       2018-11-17 12:46:48 +08:00 via Android
    @changnet #4

    你这样说有歧义啊,其实 text executable 不是 shell 解析的,是内核执行的。脚本内容是 shell 解析的。

    #!那一行是内核解释的。参考 exec 系的系统调用。



    @iRiven #6

    因为 text executable 是内核解释的,见上
    webdisk
        8
    webdisk  
       2018-11-17 12:48:43 +08:00
    @iRiven #6 因为是内核支持的格式啦,你可以在 linux 内核 menu config 里面找到相关的选项。
    还有就是 windows 上的 exe 在安装 wine 后也能直接运行, 原理就是 binfmt
    iwtbauh
        9
    iwtbauh  
       2018-11-17 12:50:34 +08:00 via Android
    @iRiven #6

    内核启动完毕后,内核会创建线程然后调用 sys_execve 去执行 /sbin/init (或者内核参数 init=),execve 会检查文件类型,对于 elf 文件去执行 elf 文件,对于#!开头的文件去执行#!后面的东西。

    也就是说 text executable 和 elf executable 是对用户和应用程序透明的,无脑 exec 即可
    kaohaonan6666
        10
    kaohaonan6666  
    OP
       2018-11-17 12:58:25 +08:00 via iPhone
    @ysc3839 就是通过 file 命令查看 shell 脚本的文件格式
    feather12315
        11
    feather12315  
       2018-11-17 13:01:11 +08:00 via Android
    execv 系列 syscall,支持#开头的可执行文件,就酱
    ysc3839
        12
    ysc3839  
       2018-11-17 16:33:29 +08:00 via Android
    @kaohaonan6666 因为那就是纯文本文件,所以这么显示。
    Osk
        13
    Osk  
       2018-11-17 16:43:34 +08:00 via Android
    text 一般是脚本,由对应的脚本解释器翻译成对应硬件体系的机器码执行。
    elf 大部分情况下是包含一堆直接可以由硬件执行的机器指令。

    脚本一般可读性很不错,机器码的话,天书了。

    反正记住 cpu 只认它对应的机器码(指令集)。

    这样理解就清楚多了,虽然不准确,且可能有特殊情况。
    firebroo
        14
    firebroo  
       2018-11-17 18:05:33 +08:00
    @Osk 感觉你没看懂他们在讨论啥。。
    Osk
        15
    Osk  
       2018-11-17 19:22:28 +08:00 via Android
    @firebroo 我没管楼上在讨论啥,我是在回复楼主的部分问题。
    rangerforce007
        16
    rangerforce007  
       2018-11-17 23:28:46 +08:00
    Ascii text 可执行文件 原来是 shell 脚本啊
    kaohaonan6666
        17
    kaohaonan6666  
    OP
       2018-11-19 17:27:24 +08:00
    @Osk 那为什么比如 hadoop 体系下的 一些启动脚本都是采用 text 方式,而比如 mysql 的服务启动脚本却直接编译成机器码呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3240 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:41 · PVG 20:41 · LAX 05:41 · JFK 08:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.