专栏中心

EEPW首页 > 专栏 > 编译动态库时遇到relocation R_X86_64_32 against `a local symbol'的错误

编译动态库时遇到relocation R_X86_64_32 against `a local symbol'的错误

发布人:电子禅石 时间:2020-02-20 来源:工程师 发布文章

主要:是编译.o 文件时,也加上-fPIC 参数,与编译器版本有关。

有三个文件【hello.c  main.c  hello.h】在执行下面的第三条命令时出现标题的错误(程序清单见文章末尾):

$gcc -c hello.c

$gcc -c main.c

$gcc -shared -fPIC -o hello hello.o main.o

.. relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

... could not read symbols: Bad value

解决办法编译器已经提示了:recompile with -fPIC


但是我们应该重新编译谁带上这个参数呢?经过我几番折腾,发现如下情况:

1、编译.o文件的时候,没有加参数-fPIC,(网友说这样的问题在gcc version 3.4.6版本没有发生,即该版本编译器默认加上了-fPIC,未验证过),本人在出现问题时查看了当前系统的gcc版本,为下面红色标记部分。

/home/gateway/priv/yzj/union_183>gcc -v

Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-48))

2、当前程序中有用到某个静态库,那个静态库编译.o文件的时候没有加上-fPIC(静态库其实就是.o文件打包)。补充一点:我发现手写Makefile时即使不加-fPIC也没有这个问题,这一点很郁闷,这个只在用automake工具编译出.a文件时才出现过。

原因:某些版本的gcc默认没加-fPIC参数

解决办法:保证你编译.o文件的时候,都加上-fPIC,这样你才能编译出动态库来。

$gcc-fPIC -c hello.c

$gcc-fPIC -c main.c

$gcc -shared -fPIC -o hello hello.o main.o
这样能顺利生成hello.

补充说明:以上问题的出现是基于看到“红黑联盟网站上的一篇关于链接及库讲解”文章中列举出的案例,文中作者在论述时是用本文开头的方法来编译且能成功,但本人在做测试时发现存在问题故而写下此篇,该文章链接地址如下。

file:///H:/%E5%8F%82%E8%80%83%E7%AC%94%E8%AE%B0/%E7%8B%AC%E7%AB%8B%E6%80%A7%E8%B5%84%E6%96%99/%E7%BE%A4%E9%87%8C%E8%B5%84%E6%96%99%E6%94%B6%E9%9B%86/%E5%8A%A8%E6%80%81%E5%BA%93%E7%B3%BB%E5%88%97/[Linux]%E9%93%BE%E6%8E%A5%EF%BC%8C%E9%9D%99%E6%80%81%E5%BA%93%E5%92%8C%E5%8A%A8%E6%80%81%E5%BA%93%20-%20%E5%85%B6%E4%BB%96%E7%BB%BC%E5%90%88%20-%20%E7%BA%A2%E9%BB%91%E8%81%94%E7%9B%9F.htm


程序清单

1.main.c

int main()
{
hello("everyone");
return 0;
}


2.hello.c

#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!/n", name);
}

3.hello.h

#ifndef HELLO_H
#define HELLO_H
 
void hello(const char *name);
 
#endif //HELLO_H
————————————————

原文链接:https://blog.csdn.net/usbdrivers/article/details/8854256

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

高精度电流传感器集成电路增强功率转换

RISC-V的发展演进与晶心科技在构建全球生态中的核心作用

[Android开发视频教学]SQLite使用方法(16)

视频 2010-10-29

OpenAI与甲骨文放弃数据中心扩建计划

ARM产品技术服务指南

[Android开发视频教学]ContentProvider初步(19)

视频 2010-10-29

硬件级注意力机制,华为896线激光雷达的体验革命

小芯片,大声音:半导体如何让万物发声、聆听与思考

汽车电子 2026-03-10

[Android开发视频教学]文件下载(18)

视频 2010-10-29

[Android开发视频教学]调试程序(17)

视频 2010-10-29

AnyCAN嵌入式模块系列产品选型指南

OpenClaw刷屏背后的隐忧,“养龙虾”真的安全吗?

2026-03-10

优化差分放大器电路!高精度只需这几步

ARM RealView开发套件功能简介

资源下载 2007-03-30

ARM7TDMI-S(Rev 4)技术参考手册 (英)

资源下载 2007-03-30

伊朗冲突扰乱半导体供应链

2026-03-10

[Android开发视频教学]Handler的使用(二)(15)

视频 2010-10-29

模拟芯视界 | 如何避免摄像头 “罢工”?电压监控让功能安全不缺位

代理AI驱动CPU需求回暖

2026-03-10
更多 培训课堂
更多 焦点
更多 视频

技术专区