我知道“init”是加载内核后启动的第一个进程,但对我来说有一个歧义。如果它是一个进程,它必须有一个二进制可执行文件。然而,下面的共享对象是编译后的代码,看起来像可执行文件,但没有 main 函数。
sardari@mint / $ file /sbin/init
/sbin/init: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=7a4c688d009fc1f06ffc692f5f42ab09e68582b2, stripped
显然共享对象可以是可执行文件,但为什么呢?
答案1
当使用-pie
(位置独立的可执行文件) 例如 :
gcc -pie -fPIC hello.c
然后你有:
#file ./a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x2afb7892000a1dc5b9010c591b75987188aa2d66, stripped
如果您需要更多信息,您可以访问与位置无关的代码