我知道 libc.so 是可执行的,因为:
我参考了很多文档,.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
获取(仅)如果您希望运行解释器(例如 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
文档。