我正在尝试为仅包含一些库的嵌入式系统构建可重定位的二进制文件。它不会包含任何源文件,只是将库链接到可重定位文件,如下所示:
ld -r -o <binary_name> --whole-archive <list of libraries>
如果我不使用--whole-archive选项,那么生成的二进制文件将不包含任何符号,因为,我没有链接任何将使用这些符号的目标文件。因此,我正在使用--whole-archive,并且二进制文件已成功生成。
现在,我想减小二进制文件的大小。我的嵌入式系统上只有几个应用程序,因此,我确切地知道我的应用程序将使用库列表中的哪些符号。因此,在链接时,我只想在最终的二进制文件中仅包括这组符号。
例如,假设我正在尝试将libc链接到可重定位的二进制文件中。并假设,我的应用程序将仅使用来自libc的printf符号,然后我希望可重定位的二进制文件仅包含printf和printf使用的任何符号。
有什么方法可以实现?
一种快速而肮脏的方法可能是编译并将函数指针表链接到所需的库函数:
#include <stdio.h>
typedef void (*fn_t)(void);
fn_t fns[] = {
(fn_t)printf,
};
有什么方法可以实现?
是:
ld -r -o <binary_name> -u printf <list of libraries>