在我的程序中,两个"so“- libcpss.so和libhelper.so必须加载到一个固定的虚拟地址,这是由ld脚本完成的,
SECTIONS
{
/* Code section, access rights RX */
. = 0x14600000;
…
}readelf -l libhelper.so | less
Elf文件类型是DYN (共享目标文件)入口点0x14607ad8有8个程序头,从偏移量64开始
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000010000 0x0000000014600000 0x0000000014600000
0x000000000001aaec 0x000000000001aaec R E 0x10000一个elf程序链接了这两个".so",我们可以看到这两个确实被加载到了预期的固定地址中,
LDD./appDemo
linux-vdso.so.1 => (0x0000ffff917ec000)
libcpss.so => ./libcpss.so (0x0000000010000000)
libhelper.so => ./libhelper.so (0x0000000014600000)
libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffff917b5000)
librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (0x0000ffff9179d000)
libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffff91789000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff916d7000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff91583000)
/lib/ld-linux-aarch64.so.1 (0x0000aaaadd94f000)然而,我构建了另一个" so“,使得链接(依赖于)这两个so,似乎无法将这两个so加载到适当的固定地址,如下所示-
Ldd./libtestScript.so
linux-vdso.so.1 => (0x0000ffff8d87c000)
libcpss.so => ./libcpss.so (0x0000ffff89d50000)
libhelper.so => ./libhelper.so (0x0000ffff5e350000)
libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffff5e31c000)
librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (0x0000ffff5e304000)
libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffff5e2f0000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff5e23e000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff5e0ea000)
/lib/ld-linux-aarch64.so.1 (0x0000aaaae0958000)在构建“联合.so”的过程中,我是否遗漏了一些LD标志?我看到elf主程序和“联合”的唯一区别是“-shared”的标志,那么为什么“联合.so”遗漏了两个独立的so的加载地址的信息?当ld.so加载“联合.so”并试图解析并加载两个依赖项".so“时,它没有将它们加载到固定地址(0x10000000/ 0x14600000)
NOK: LD_DEBUG=all LDD./libtestScript.so
2349: file=libhelper.so [0]; generating link map
2349: dynamic: 0x0000ffff5d581ba0 base: 0x0000ffff48f57000 size: 0x000000002b9ff004
2349: entry: 0x0000ffff5d55ead8 phdr: 0x0000ffff8ca6fcc0 phnum: 8OK: LD_DEBUG=all ldd./appDemo
2289: trying file=./libhelper.so
2289:
2289: file=libhelper.so [0]; generating link map
2289: dynamic: 0x000000001462aba0 base: 0x0000000000000000 size: 0x000000002b9ff004
2289: entry: 0x0000000014607ad8 phdr: 0x0000ffffb2e24cc0 phnum: 8readelf -h ./libhelper.so
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: AArch64
Version: 0x1
Entry point address: 0x14607ad8
Start of program headers: 64 (bytes into file)
Start of section headers: 228680 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 8
Size of section headers: 64 (bytes)
Number of section headers: 34
Section header string table index: 31如果你能帮我的话我会很感激的。向陈星豪致以良好的问候
发布于 2019-12-17 15:04:16
添加-Wl标志后,生成libtestScript.so时-Ttext-segment=0xXXXXXXXX(如0x70000000),结果如预期:
ldd libtestScript.so
linux-vdso.so.1 (0x0000007fa6f04000)
libcpss.so => ./libcpss.so (0x0000000010000000)
libhelper.so => ./libhelper.so (0x0000000014600000)
libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007fa6ece000)
librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (0x0000007fa6eb7000)
libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000007fa6ea2000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007fa6de6000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007fa6c8d000)
/lib/ld-linux-aarch64.so.1 (0x0000005565c4c000)https://stackoverflow.com/questions/59262764
复制相似问题