为什么没有interp部分的libonload.so可以执行?

问题描述 投票:0回答:1

我知道 libc.so 是可执行的,因为:

  1. libc.so 有一个入口点函数。
  2. libc.so 中有 .interp 部分。

我参考了很多文档,.interp 部分被认为是可执行文件所必需的。 当我使用 call libonload.so 时,我可以执行 libonload.so,但 readelf 显示没有 .interp 部分。 我不知道它是如何运作的。 我运行libonload.so,结果是:

[root@localhost onload-7.1.1.75]# /usr/lib64/libonload.so 
Onload 7.1.1.75
Copyright 2019-2021 Xilinx, 2006-2019 Solarflare Communications, 2002-2005 Level 5 Networks
Built: Mar  4 2024 15:49:30 (release)
Build profile header: <ci/internal/transport_config_opt_extra.h>

readelf -l /usr/lib64/libonload.so:

[root@localhost onload-7.1.1.75]# readelf -l /usr/lib64/libonload.so 

Elf file type is DYN (Shared object file)
Entry point 0xa2e0
There are 8 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x00000000000a5ff0 0x00000000000a5ff0  R E    200000
  LOAD           0x00000000000a6818 0x00000000002a6818 0x00000000002a6818
                 0x0000000000002770 0x0000000000003060  RW     200000
  DYNAMIC        0x00000000000a6d90 0x00000000002a6d90 0x00000000002a6d90
                 0x00000000000001f0 0x00000000000001f0  RW     8
  NOTE           0x0000000000000200 0x0000000000000200 0x0000000000000200
                 0x0000000000000024 0x0000000000000024  R      4
  TLS            0x00000000000a6818 0x00000000002a6818 0x00000000002a6818
                 0x0000000000000000 0x0000000000000bec  R      8
  GNU_EH_FRAME   0x0000000000094684 0x0000000000094684 0x0000000000094684
                 0x000000000000245c 0x000000000000245c  R      4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     10
  GNU_RELRO      0x00000000000a6818 0x00000000002a6818 0x00000000002a6818
                 0x00000000000007e8 0x00000000000007e8  R      1

 Section to Segment mapping:
  Segment Sections...
   00     .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .plt .text .rodata .eh_frame_hdr .eh_frame 
   01     .init_array .data.rel.ro .dynamic .got .got.plt .data .bss 
   02     .dynamic 
   03     .note.gnu.build-id 
   04     .tbss 
   05     .eh_frame_hdr 
   06     
   07     .init_array .data.rel.ro .dynamic .got 

顺便说一句,libonload.so 是 SolarFlare Nic 的驱动程序。源代码可以在 https://github.com/Xilinx-CNS/onload

获取
c linux shared-libraries
1个回答
0
投票

(仅)如果您希望运行解释器(例如 glibc 或 musl),则需要 Interp。您可以对系统调用进行硬编码,并自行完成所有工作,无需

ls.so
解释器。它与共享库与可执行文件无关。实际上,任何 ELF 可执行文件都是共享库,任何共享库都可以是可执行文件,都是 ELF 格式。

为什么没有 interp 部分的 libonload.so 是可执行的?

因为它就是这样建造的。请参阅https://github.com/majek/openonload/blob/aff60a36ed3543446d9ff179905f47c47d1e300b/src/lib/transport/unix/mmake.mk#L85

man ld
。请参阅 https://unix.stackexchange.com/questions/588240/what-mandates-the-start-entrypoint-kernel-ld-linux-so-etc 和链接文章 https://lwn.net/Articles /630727/https://lwn.net/Articles/631631/ 。请参阅有关
man elf
e_entry
文档。

© www.soinside.com 2019 - 2024. All rights reserved.