从C静态库中删除内部符号

我正在研究一些作为静态库提供的嵌入式代码。 我们希望从库中删除所有内部符号,并只保留API符号可见。

下面是我们想要做的一个例子:想象一下你有一个名为internal.c的文件,一个名为api.c的文件如下所示:

/* internal.c */

int fibonacci(int n)
{
    /* Compute the nth Fibonacci number and return it */
}


/* api.c */

#include "internal.h"
#include <stdio.h>

void print_fibonacci(n)
{
    printf("Fibonacci(%d): %dn", n, fibonacci(n));
}

用户应该只能访问print_fibonacci函数,而所有内部符号(如fibonacci函数)应在发货前解决。 这意味着用户应该能够定义他自己的称为fibonacci的函数,而不必担心与图书馆的冲突。

我们已经通过使用ld --relocatable尝试了内部链接,但是我们似乎无法使用objcopy来删除这些符号。 这是否可行?

谢谢您的帮助!

编辑:用户定义的fibonacci函数不应该替代库定义的函数,它们应该能够共存。 基本上我正在寻找解决命名冲突的解决方案。


静态库本质上是一堆对象文件。 静态库中的所有对象文件都被视为由链接器单独提供。 一般来说,链接器不可能将某些符号视为内部链接器,链接器根本没有足够的信息来实现。

以下是解决这些问题的几个策略:

  • 为您的库中的非公共功能构建一个单独的名称空间。 例如,你的fibonacci函数可以放在一个名字空间libfoo_internal_fibonacci 。 如果你绝望,你可以在你的内部头文件中使用这样的宏:

    #define fibonacci INTERNAL_PREFIX ## fibonacci
    

    这将允许您在编译时随意更改前缀。 我建议不要这样做,因为它会使调试变得更加困难。 如果你能应付更长的内部名称,这将是一个很好的策略。

  • 使所有内部函数static并合并翻译单元,以便每个内部函数仅由一个翻译单元使用。 这可能会解决你的问题,但它会使结果程序变大:大多数连接器可以将整个对象作为一个整体,也可以根本不接受它。 如果你只想使用一个函数,如果链接器必须包含巨大的目标文件,那么程序中会有很多死代码。

  • 把你的图书馆变成共享图书馆,并使用地图文件或不同的机制来指定哪些图标应该被导出。 这在我看来是最好的选择,但它不是完全可移植的,也许你真的希望你的图书馆保持静态。

  • 链接地址: http://www.djcxy.com/p/22121.html

    上一篇: Removing internal symbols from C static library

    下一篇: What scipy statistical test do I use to compare sample means?