Dll 将共享库加载到共享内存中

Dll 将共享库加载到共享内存中,dll,shared-libraries,dynamic-linking,dynamic-library,Dll,Shared Libraries,Dynamic Linking,Dynamic Library,我是否可以将共享库加载到进程中的共享内存中,以便其他进程可以简单地映射共享内存(到同一地址)并简单地调用函数?我知道共享库中的外部需要额外跳转到进程特定的内存位置,以调用适当的函数(如elf plt)。但是,在今天的工具中,这样的事情是否可行 但是,在今天的工具中,这样的事情是否可行 现在的工具不行,以后也不行 当然,如果您的共享库具有完全自包含的函数,那么它就可以工作。但是,当库引用外部数据或函数时,就会崩溃并烧毁 我知道共享库中的外部函数需要额外跳转到进程特定的内存位置,以调用适当的函数 我

我是否可以将共享库加载到进程中的共享内存中,以便其他进程可以简单地映射共享内存(到同一地址)并简单地调用函数?我知道共享库中的外部需要额外跳转到进程特定的内存位置,以调用适当的函数(如elf plt)。但是,在今天的工具中,这样的事情是否可行

但是,在今天的工具中,这样的事情是否可行

现在的工具不行,以后也不行

当然,如果您的共享库具有完全自包含的函数,那么它就可以工作。但是,当库引用外部数据或函数时,就会崩溃并烧毁

我知道共享库中的外部函数需要额外跳转到进程特定的内存位置,以调用适当的函数

我想你不明白。让我们考虑一个例子:

void *foo() { return malloc(1); }
将其内置到Linux上的共享库中时,结果是:

0x00000000000006d0 <+0>:    mov    $0x1,%edi
0x00000000000006d5 <+5>:    jmpq   0x5c0 <malloc@plt>
0x00000000000006d0:mov$0x1,%edi
0x00000000000006d5:jmpq 0x5c0

函数的汇编程序代码转储malloc@plt:
0x00000000000005c0:jmpq*0x200a5a(%rip)#0x201020
0x00000000000005c6:pushq$0x1
0x00000000000005cb:jmpq 0x5a0
所以问题是:在第二个过程中,
jmpq*0x200a5a(%rip)
。回答:两个地方中的一个

如果第一个进程已经调用了<代码> MALC/C >代码(很有可能),那么在第一个进程中,JMPQ 将转到<代码> MALLC/<代码>的地址,在第二个进程中,它不太可能成为<代码> MALLC/<代码>的地址,更可能是未映射的,或者处于某些数据的中间。不管怎样,你都会崩溃

如果第一个进程尚未调用
malloc
,则第二个进程中的
jmpq
将跳转到运行时加载程序的地址(
ld linux.so.2
或linux上的类似地址,Solaris上的
ld.so
解析程序函数)。同样,该地址不太可能也是第二个进程中解析程序的地址,如果不是,则会崩溃

但从这里开始情况变得更糟。如果在第二个过程中,通过某种不可能的魔法,您实际上调用了
malloc
,那么
malloc
本身很可能崩溃,因为它将尝试使用以前设置的数据结构,使用从
sbrk
mmap
获得的内存。这些数据结构出现在第一个进程中,但不在第二个进程中,因此再次崩溃

Dump of assembler code for function malloc@plt:
  0x00000000000005c0 <+0>:  jmpq   *0x200a5a(%rip) # 0x201020 <malloc@got.plt>
  0x00000000000005c6 <+6>:  pushq  $0x1
  0x00000000000005cb <+11>: jmpq   0x5a0