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

Fhi*_*vor 1 linux zipcode function segmentation-fault

如果我有一个指向函数的指针,并将其交给另一个(Unrelated/Child)可执行文件,如何在不进行段错误的情况下调用该函数?

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

Dim As Function (ByRef As String) As Integer MyFunction
' get pointer...
MyFunction = FunctionPointer
Run Code Online (Sandbox Code Playgroud)

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

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

Emp*_*ian 7

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

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

BASIC,我没有线索;-(

  • 当PIE-executable被dlopen()编辑时,它的_start不会被调用(你可以在调试器中验证它).(主)可执行文件中的_start仅通过RTLD_START宏从_dl_start调用一次.请参阅elf/rtld.c和RTLD_START的定义,例如sysdeps/x86_64/dl-machine.h (3认同)
  • 你不知道你在说什么.当libc.so.6动态链接时(它将用于PIE可执行文件),则可执行文件的入口点不会调用libc初始化; 它由动态加载器直接调用,加载器不会调用它两次(没有理由这样做). (2认同)
  • 不,它没有.Linux上的静态构造函数不会被_start或_main调用; 它们是从一个特殊的.init部分调用的(由PIE二进制文件中的DT_INIT引用); 当PIE二进制文件本身运行时,以及它被另一个可执行文件dlopen()编辑时. (2认同)