SweeNeil 2018-11-15 06:42 采纳率: 100%
浏览 2891
已采纳

linux下,如何把libc.a静态编译进动态库中

大佬们,怎样把libc.a的内容静态编译进动态库里呀?比如我动态库里有一个printf,我要怎么把printf静态编译进去?

 

就比如我编写了一个.c文件,我想把它编译成共享库,在我这个.c中我使用了printf函数。我编译了这个共享库,但是我共享库里面调用了标准C库比如printf,这个printf里面的内容并没有被添加到我的共享库so文件中,到时候使用时还需要重定位。现在我想把我共享库里面用到的C标准库的内容,比如printf静态编译到我的共享库so文件中,让so文件中带有printf的实现。能否实现这样的情况呢?

 

现在遇到的问题是报错如下:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
test.o: could not read symbols: Bad value
collect2: ld returned 1 exit status

  • 写回答

1条回答 默认 最新

  • ZhihengTao 2018-11-15 07:23
    关注

    什么叫*把lib.a编译进动态库*?

    整个编译过程:
    1. 预处理(gcc -E) - 输出预处理后源码
    2. 编译(gcc -S) - 输出汇编代码(汇编文件)
    3. 汇编(gcc -c) - 输出机器码(目标文件)
    4. 链接 - 输出可执行连接文件(即ELF文件)

    静态链接: 将全部符号(变量,函数)都拷贝到最终ELF

    动态链接: 仅在ELF中将部分符号做标记,运行时通过链接器动态加载并查找对应符号

    动态链接要求使用的目标文件是可重定位的,而动态库则可以认为是一系列可重定位符号的集合(一个或多个可重定位目标文件的集合)

    静态链接对使用的目标文件没有要求

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 js指定时间段显示图片广告
  • ¥15 Pycharm中程序直接运行可以但进入调试报错
  • ¥15 MATLAB动图问题
  • ¥15 有段代码不知道怎么理解,const isToken = (config.headers || {}).isToken === false
  • ¥15 我的显卡支持CUDA最高版本是12.3,这个版本也支持VS 2022 17.0这种情况下如果我想下载CUDA11.8,需要下载旧版本的VS2022吗
  • ¥100 采用栈和深度优先算法取消graphics库采用其他方式显示路径打印显示路径取消graphics库
  • ¥15 pointnet2包安装
  • ¥20 射频功率问题,解答者有酬谢!
  • ¥80 构建降雨和积水的预测模型
  • ¥15 #Qt Transform setTransform()在鼠标拖动移动视角是一致在原地不动,无法变换视角(细微观察似乎视图有在原地抖动),无法变换视角(细微观察似乎视图有在原地抖动)