![](/img/trans.png)
[英]How to separate debug symbols from a C static library and later load it in GDB
[英]Removing internal symbols from C static library
我正在研究一些作为静态库提供的嵌入式代码。 我们希望从库中删除所有内部符号,并仅保留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): %d\n", n, fibonacci(n));
}
用户应该只能访问print_fibonacci
函数,而所有内部符号(如fibonacci
函数)应在发货前解析。 这意味着用户应该能够定义自己的名为fibonacci
的函数,而不必担心与库的冲突。
我们已经尝试使用ld --relocatable
内部链接,但我们似乎无法使用objcopy删除符号。 这有可行吗?
谢谢您的帮助!
编辑:用户定义的fibonacci
函数不应该替换库定义的函数,它们应该只能共存。 基本上我正在寻找解决命名冲突的解决方案。
静态库本质上是一堆目标文件。 静态库中的所有目标文件都被视为链接器单独提供的文件。 通常,不可能使链接器将某些符号视为内部符号,链接器根本没有足够的信息来执行此操作。
以下是解决这些问题的几种策略:
为库中的非公共函数构建单独的名称空间。 例如,您的fibonacci
函数可以放在内部名称空间libfoo_internal_fibonacci
。 如果你是绝望的,你可以在内部头文件中使用宏,如下所示:
#define fibonacci INTERNAL_PREFIX ## fibonacci
这将允许您在编译时任意更改前缀。 我建议不要这样做,因为它会使调试变得更难。 如果你能应付更长的内部名称,这将是一个很好的策略。
使所有内部函数static
并合并转换单元,以便每个内部函数仅由一个转换单元使用。 这可能会解决您的问题,但它会使得结果程序更大:大多数链接器可以将对象作为一个整体或根本不接受它。 如果链接器必须包含大型目标文件(如果您只想使用单个函数),则可能最终会在程序中出现大量死代码。
将您的库转换为共享库并使用mapfiles或其他机制来指定应该导出哪些符号。 这是我认为最好的选择,但它不是完全可移植的,也许你真的希望你的库保持静态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.