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

2018-11-17 10:03:37 +08:00
 kaohaonan6666

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

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

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

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



@iRiven #6

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

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

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

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

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

这样理解就清楚多了,虽然不准确,且可能有特殊情况。
firebroo
2018-11-17 18:05:33 +08:00
@Osk 感觉你没看懂他们在讨论啥。。
Osk
2018-11-17 19:22:28 +08:00
@firebroo 我没管楼上在讨论啥,我是在回复楼主的部分问题。
rangerforce007
2018-11-17 23:28:46 +08:00
Ascii text 可执行文件 原来是 shell 脚本啊
kaohaonan6666
2018-11-19 17:27:24 +08:00
@Osk 那为什么比如 hadoop 体系下的 一些启动脚本都是采用 text 方式,而比如 mysql 的服务启动脚本却直接编译成机器码呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/508712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX