在不相关的可执行linux中调用函数

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

如果我有一个指向函数的指针,并将其交给另一个(不相关/子)可执行文件,我怎样才能在不产生段错误的情况下调用该函数?

目前我可以创建一个函数并为其分配这个内存地址:

Dim As Function (ByRef As String) As Integer MyFunction
' get pointer...
MyFunction = FunctionPointer

但是然后调用 MyFunction 我遇到了段错误(显然是因为我调用的函数位于另一个我不允许访问的可执行文件地址空间中)

我该如何解决这个问题/解决它?

linux function segmentation-fault zipcode
2个回答
9
投票

更新:

注意:此解决方案不再适用于较新的 GLIBC 版本:

dlopen
拒绝打开 PIE 二进制文件。


如果您可以控制 other 可执行文件(您想要从中调用函数的可执行文件),则将其构建为

PIE
(与位置无关的可执行文件),并将其加载到第一个可执行文件的地址空间中。

C
中,您可以使用
-fPIC -pie
进行构建,然后使用
dlopen(3)
dlsym(3)

BASIC
,我不知道;-(


2
投票

并不是说您“不允许访问”另一个函数的地址空间,而是该空间是一个完全不同且不相关的地址空间。每个进程都有自己的虚拟地址空间,因此指针的数值在另一个函数地址空间中没有任何意义,即使您能够以某种方式交换它。

对于一般的进程间通信,您通常会从系统显式请求共享内存,但我不确定 FreeBasic 是否公开了此类功能。为什么不查找一些现有的远程过程调用库?

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