【问题标题】:call function in unrelated executable linux在不相关的可执行linux中调用函数
【发布时间】:2011-07-07 20:58:32
【问题描述】:

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

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

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

然后调用 MyFunction 我得到一个段错误(显然是因为我正在调用的函数在另一个可执行文件地址空间中,而我不允许访问)

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

【问题讨论】:

  • 在提出问题的层面上,最合适的答案似乎是:你不能

标签: linux function segmentation-fault zipcode


【解决方案1】:

如果您可以控制 other 可执行文件(您要从中调用函数的那个​​),则将其构建为 PIE(与位置无关的可执行文件),并将其加载到第一个可执行文件的地址空间。

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

BASIC,我不知道;-(

【讨论】:

  • 坏主意。可执行文件的入口点会调用C库的初始化例程,该程序会重置malloc堆,并调用新的可执行文件的main,各种怪事都会发生。
  • 你不知道你在说什么。当 libc.so.6 被动态链接时(它将用于 PIE 可执行文件),则 libc 初始化由可执行文件的入口点调用;由动态加载器直接调用,加载器不会调用两次(没有理由这样做)。
  • 我指的是从每个 C 程序中的静态链接入口点代码调用的 __libc_start_main 调用。这,除其他外,扫描 ELF 辅助向量(从 dlopen 调用时不存在),设置堆栈保护(如果它已经认为它有一个,这将使程序崩溃),设置 TLS(应该已经设置,对吗?您只是丢失了所有 TLS 值)并进行了各种其他初始化
  • 当 PIE 可执行文件是 dlopen() 时,它的 _start 不会被调用(你可以在调试器中验证)。 (主)可执行文件中的 _start 仅通过 RTLD_START 宏从 _dl_start 调用一次。请参阅 elf/rtld.c 和 RTLD_START 的定义,例如sysdeps/x86_64/dl-machine.h
  • 不,它没有。 Linux 上的静态构造函数不被 _start 或 _main 调用;它们是从特殊的 .init 部分调用的(由 PIE 二进制文件中的 DT_INIT 引用);当 PIE 二进制文件本身运行时,以及当它被另一个可执行文件 dlopen()ed 时。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多