无关可执行linux中的call函数

无关可执行linux中的call函数,linux,function,segmentation-fault,zipcode,Linux,Function,Segmentation Fault,Zipcode,如果我有一个指向某个函数的指针,并且我将该指针赋给另一个(不相关的/子)可执行文件,那么我如何调用该函数而不产生错误 目前,我可以创建一个函数,并为其分配以下内存地址: Dim As Function (ByRef As String) As Integer MyFunction ' get pointer... MyFunction = FunctionPointer 但是调用MyFunction时,我会得到一个segfault(显然是因为我调用的函数位于另一个不允许我访问的可执行文件地址空

如果我有一个指向某个函数的指针,并且我将该指针赋给另一个(不相关的/子)可执行文件,那么我如何调用该函数而不产生错误

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

Dim As Function (ByRef As String) As Integer MyFunction
' get pointer...
MyFunction = FunctionPointer
但是调用MyFunction时,我会得到一个segfault(显然是因为我调用的函数位于另一个不允许我访问的可执行文件地址空间中)


如何修复/解决此问题?

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


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

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


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

如果您可以控制另一个可执行文件(要从中调用函数的文件),那么将其构建为
饼图(独立于位置的可执行文件),并将其加载到第一个可执行文件的地址空间中

C
中,您将使用
-fPIC-pie
构建,然后使用
dlopen(3)
dlsym(3)


BASIC
中,我没有任何线索-(

如果您可以控制另一个可执行文件(要从中调用函数的文件),则将其构建为
饼图(独立于位置的可执行文件),并将其加载到第一个可执行文件的地址空间中

C
中,您将使用
-fPIC-pie
构建,然后使用
dlopen(3)
dlsym(3)


BASIC
中,我没有任何线索-(

在问题提出的级别上,最合适的答案似乎是:您不能在问题提出的级别上,最合适的答案似乎是:您不能放弃想法。可执行文件的入口点将调用C库的初始化例程,该例程将重置malloc堆并调用新的可执行文件的
main
,会产生各种奇怪的结果。你不知道你在说什么。当libc.so.6被动态链接(对于饼图可执行文件来说是这样)时,libc初始化不由可执行文件的入口点调用;它由动态加载程序直接调用,加载程序不会调用它两次(没有理由这么做)。我指的是每个C程序中从静态链接的入口点代码调用的对uu libc_start_main的调用。这包括扫描ELF aux向量(从dlopen调用时不存在)、设置堆栈保护(如果程序已经认为它有堆栈保护,则会使程序崩溃)、设置TLS(应该已经设置好了,对吗?您刚刚丢失了所有TLS值)并进行了各种其他初始化当PIE可执行文件为dlopen()时,它的_start没有被调用(您可以在调试器中验证)。在(main)中的_start可执行文件仅通过RTLD_start宏从_dl_start调用一次。请参阅elf/RTLD.c和sysdeps/x86_64/dl-machine.hNo中的RTLD_start定义,它没有。Linux上的静态构造函数不是由_start或_main调用的;它们是从一个特殊的.init部分调用的(由饼状二进制文件中的DT_init引用);当饼图二进制文件本身运行时,以及当饼图二进制文件为dlopen()时这个可执行文件的入口点将调用C库的初始化例程,这将重置malloc堆并调用新的可执行文件的
main
,结果会产生各种奇怪的结果。你不知道你在说什么。当libc.so.6被动态链接时(对于饼图可执行文件来说是这样),那么libc初始化不由可执行文件的入口点调用;它由动态加载程序直接调用,加载程序不会调用它两次(没有理由这样做)。我指的是从每个C程序中的静态链接入口点代码调用u_libc_start_main。这包括扫描ELF aux向量(从dlopen调用时不存在)、设置堆栈保护(如果程序已经认为有堆栈保护,则会使程序崩溃)、设置TLS(应该已经设置好了,对吗?您刚刚丢失了所有TLS值)并进行了各种其他初始化当PIE可执行文件为dlopen()时,它的_start没有被调用(您可以在调试器中验证)。在(main)中的_start可执行文件仅通过RTLD_start宏从_dl_start调用一次。请参阅elf/RTLD.c和sysdeps/x86_64/dl-machine.hNo中的RTLD_start定义,它没有。Linux上的静态构造函数不是由_start或_main调用的;它们是从一个特殊的.init部分调用的(由饼状二进制文件中的DT_init引用);当饼图二进制文件本身运行时,以及当它被另一个可执行文件dlopen()调用时。