C++ 将函数调用从静态库插入到系统框架

C++ 将函数调用从静态库插入到系统框架,c++,ios,c,static-libraries,C++,Ios,C,Static Libraries,在这种情况下,我需要将第三方静态库发出的函数调用插入到iOS系统框架或共享库中。静态库供应商提供经济高效或及时维护支持的机会微乎其微,甚至不存在 实际上,将调用顺序从以下位置更改为: +-------------+ +-------------+ +---------------------+ | Application | ---> | libVendor.a | ----> | FrameworkA (.dylib) | +-------------+

在这种情况下,我需要将第三方静态库发出的函数调用插入到iOS系统框架或共享库中。静态库供应商提供经济高效或及时维护支持的机会微乎其微,甚至不存在

实际上,将调用顺序从以下位置更改为:

+-------------+      +-------------+       +---------------------+
| Application | ---> | libVendor.a | ----> | FrameworkA (.dylib) |
+-------------+      +-------------+       +---------------------+
致:

这个问题的传统解决方案是说服运行时链接器加载不同的库来代替FrameworkA,或者使用dlopen加载库。这些都不是iOS上的选项

一个可行的解决方案是使用sed重命名libVendor.a的symbol表中的符号

假设我想在FrameworkA中插入调用FrameworkA\u Foo,调用由libVendor中的函数生成。a:

只要符号名称的长度保持不变,这种方法就有效

虽然这种方法有效,但它缺乏优雅,感觉相当粗糙。是否存在更好的解决方案

考虑的其他办法:

更改链接顺序以使插入函数链接到libVendor.a,而不是框架:与大多数UNIX平台上的链接器不同,Apple的链接器递归地解析库中的符号,而它们在命令行上的显示顺序几乎没有区别 链接器脚本:lld不支持 mach-o对象文件编辑工具:找不到任何有效的工具
[为了清楚起见,这是C而不是Objective-C API,工具链是clang/LLVM。使用苹果提供的GCC不是一个选项,因为它受到了反对,并且缺乏C++11支持]

那又如何?@Dani在几个方面都不是一个选项:首先,禁止使用dlopen——注入共享库所需的。第二:自我修改代码也是如此,至少就AppStore指南而言,第三,libVendor.a绝不是framework的唯一调用方a_foo我认为AppStore不会接受任何以任何方式转移库调用的应用。@marko dlopen在iOS上运行得非常好。有人建议将dlopen视为私有API,因此不允许在AppStore应用程序中使用。现在,运行时动态链接器自然能够动态加载库,并修改其加载的库的至少一些页面,以便首先链接它们,因此沙箱显然允许所有这一切。但一个应用程序是否会因此被拒绝的问题并不明确。
+-------------+      +-------------+       +------------+       +---------------------+
| Application | ---> | libVendor.a | ----> | Interposer | ----> | FrameworkA (.dylib) |
+-------------+      +-------------+       +------------+       +---------------------+
sed s/FrameworkA_Foo/InterposeA_Foo/g < libVendor.a > libInterposedVendor.a
void InterposeA_Foo()
{
    // do some stuff here 
    // ....
    // then (maybe) forward 

    FrameworkA_Foo();
}