在ld

时间:2016-06-13 18:12:59

标签: c gcc ld

我们假设我有以下C代码:

extern int f_1();
extern int g_1();

extern int f_2();
extern int g_2();

extern int f_3();
extern int g_3();

int main(int argc, char **argv) {
    // Using f_1, f_2, f_3 and g_1, g_2, g_3 here:
    ...
}

我想通过链接3个不同的库来构建它:l1l2l3 - 假设每个库都导出自己的f和{{ 1}}函数 - 以便:

  • gf_1将分别从g_1解析为fg;
  • l1f_2将分别从g_2解析为fg;
  • l2f_3将分别从g_3解析为fg

这可以用gcc和ld:

  1. 如果l3l1l2是共享库( .so ),是否可以这样做?
  2. 如果l3l1l2是档案( .a ),是否可以这样做?

1 个答案:

答案 0 :(得分:1)

objcopy' --redefine-sym选项是您的朋友:

  

- redefine-sym old = new

     

old 符号的名称更改为 new 。这可能是有用的   尝试将两个东西联系在一起,你没有任何来源,而且有   名称冲突。

     

- 重新定义-SYMS = 文件名

     

将--redefine-sym应用于每个符号对" "列在文件中   文件名 filename 只是一个平面文件,每行一个符号对。   线条注释可以由哈希字符引入。这个选项可能是   不止一次。

将它应用于您的图书馆l1l2l3。它应该适用于 .a .so