2012-03-21 34 views
2

我们有一个巨大的代码库,包含多个依赖项(如tinyxml,fft stuff等),模板,...在C/C++中,全部它被整齐地包裹在一个非常简单的C接口后面。因为我们可以很容易地从库中去除所有不需要的符号(使用strip -S -x),只留下想要的C接口并隐藏所有的C++类/模板/依赖关系/ ...因此,最终导出/可见的唯一符号是我们的API调用:OUR_LIBNAME_FUNC1,OUR_LIBNAME_FUNC2等等在iOS静态库中包含BIG C++项目:依赖关系,剥离和隐藏

但是,我们现在想要为iOS静态库执行相同的操作,并且我们没有任何想法。有什么办法可以隐藏所有不需要/想要的符号,而不会回复到大量的代码 - 合并,重写代码,objdump-ing,混淆......?尤其是对于可能被其他人重复使用并且会导致多个符号定义的外部库!

了大量的研究(主要是堆栈溢出:-))我种成为无望后...

迎接

回答

0

回答我的问题:我们到底使出了一个匿名的命名空间和代码合并。

I.e.所有的cpp/c代码都使用一个庞大而相对复杂/丑陋的python脚本合并到大C文件中。 CPP文件中的所有函数都包装在一个匿名名称空间中,只将名称空间外的导出函数保留下来。

之后,在磁带库上做了一条-S -x清除了大部分垃圾。

I.e.

/************** AMALGAMATED CPP FILE **************/ 

/************** STD HEADERS **************/ 
#include "OurLibraryHeader.h" 
#include <cmath> 
#include <string> 
// more standard includes here and includes that aren't possible to do in the anonymous namespace 

/************** AMALGAM **************/ 
namespace { 
#include "OneofOurheaders1.h" 
#include "OneofOurheaders2.h" 
#include "SomeExternalLib.h" 

/************************* OneofOurImplementations.cpp *************************/ 
// included literally 

/************************* OneofOurImplementations2.cpp *************************/ 
// included literally 

// etc 
} 

int OneOfOurLibraryFunctions() 
{ 
} 

// etc 

这是相当肮脏,但它完成工作。 我敢肯定有更好的方法与一些LLVM弄虚作假做到这一点...

  • 布拉姆
0

OK,我只是花了很多时间做一些与此类似。这是不完美的,但是这对我们的目的来说已经足够好了。

  1. 将您的C api顶级入口点放在一个文件“c_api.c”中。
  2. 由它自己创建一个文件“c_api.symbols”上线 每一个入口点的名称“_”链接器增加了
  3. 使用连接到您的API预链接到你的内部库

事情是这样的:

% cat c_api.c 
#include "libA.h" 
#include "libB.h" 
#include "libC.h" 

void init() 
{ 
    libA_startup(); 
} 

void run() 
{ 
    libB_execute(libA_context()); 
} 

void stop() 
{ 
    libA_shutdown(); 
    libB_end(); 
    libC_log(); 
} 
% cat c_api.symbols 
_init 
_run 
_stop 
% cc -c a_api.c 
% ld -x -r c_api.o libA.a libB.a libC.a -exported_symbols_list c_api.symbols -o c_api_hidden.o 
% ar r c_api.a c_api_hidden.o 
+0

这将是有趣的尝试......我想这涉及到更步骤得到的东西建立。下面描述的我的方法是通过完成构建并在之后剥离来实现的。 – 2013-02-18 16:01:21

+0

额外的步骤是明确列出您的C API导出。 ld将除去exported_symbols_list中的符号之外的所有内容。可以说比将所有内容整合到一个文件中更可怕。 “ar”步骤只有在你想给某人一个“.a”而不是“.o” – mtoy 2013-03-29 17:19:52