可执行文件与共享对象

我在做find /bin -exec file {} \;发现了一些东西find /bin -exec file {} \;

file命令报告/bin中的一些条目是shared objects ,而其他条目是executables 。 例如,

/斌/ ntfsck:
ELF 64位LSB 共享对象 ,x86-64,版本1(SYSV),
动态链接(使用共享库),用于GNU / Linux 2.6.24,BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00,剥离

同样的报告gawk

在/ usr / bin中/ GAWK:
ELF 64位LSB 共享对象 ,x86-64,版本1(SYSV),
动态链接(使用共享库),用于GNU / Linux 2.6.24,
BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9,剥离

相比之下, /bin/echo file是:

/斌/回声:
ELF 64位LSB 可执行文件 ,x86-64,版本1(SYSV),
动态链接(使用共享库),用于GNU / Linux 2.6.24,
BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c,剥离

基本上,我想知道executable文件和shared object文件之间的区别。

文艺青年最爱的

除了已编译的可执行文件可能链接到共享对象而不是针对可执行文件这一事实之外,没有区别。


通常,有两种方法可以编译1个可执行文件:

  • 使用静态链接:编译源代码中包含的外部库,并将编译库(或链接器透视图中的对象)添加到可执行文件本身;
  • 使用动态链接:编译源代码中包含的外部库,但是将编译库(或链接器透视图中的对象)的链接添加到可执行文件中(如果链接器在运行时加载已编译的库/对象,则需要的话);

使用这些方法各有利弊,但这不是问题的关键所在;

  • /bin/ntfsck/usr/bin/gawk是共享对象:这意味着可以编译可执行文件,然后链接它们以使用它们的function;
  • /bin/echo是一个可执行文件:这意味着可执行文件可能无法编译,然后与其链接以使用其function;

所以/bin/ntfsck/usr/bin/gawk是技术上编译的库(或链接器透视图中的对象),但是,正如一个人可能有forsaw,没有什么能阻止共享对象作为可执行文件运行。

在旁注中,还要注意file报告(对于每个file ):

动态链接(使用共享库)

这意味着它们中的每一个都动态链接到(并可能使用)其他共享对象。


1.“编译”旨在更广泛的接受,包括预处理,编译和链接。

另一个区别是可执行文件具有已定义的入口点地址偏移量,即i386为0x08048000,x86为0x00400000,arm为0x00010000。

共享对象文件可以是库,也可以是可执行文件。 当作为可执行文件时,没有这样的偏移。 可以说, 共享对象可执行文件是使用地址空间布局随机化(ASLR)的位置独立可执行文件(PIE)。 因此,在查看其/ proc / pid / maps文件时,您会注意到,与标准可执行文件相比,加载段的位置在每次执行时都会有所不同。

此function背后的想法是通过阻止攻击者执行面向返回的程序攻击来增加可执行文件的安全性。 许多维护者决定构建默认启用PIE的软件包,例如Fedora 23或Ubuntu 17.10。