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