1.现象,程序在启动的时候报如下错误
error while loading shared libraries: /home/test/lib/libtest.so: unexpected reloc type 0x03

2.分析,可以通过readelf进行查看依赖的目标文件是否存在non-pic情况,对比新旧版本
readelf -d libtest.so|grep TEXTREL 
PIC:Position Independent Code.
有TEXTREL说明该目标文件是non-PIC, 没有则是PIC的,PIC的动态链接库不会含有任何代码段重定位表,TEXTREL即代码段重定位表

指令跳转                      数据访问

模块内部: 相对跳转和调用            相对地址访问

模块外部: 间接跳转和调用(GOT) 间接访问(GOT)

注:-fPIC和-fpic区别在于-fpic产生的代码小,执行速度快。但是-fpic在某些平台上会有限制,因为地址无关代码是硬件平台相关的。比如全局符号的数量、代码长度等。-fPIC则没有这种限制。

non-PIC在使用-fPIC选项会出现问题
libtest.so.new
Dynamic section at offset 0x19d928 contains 37 entries:
Tag Type Name/Value
0x00000003 (PLTGOT) 0x1a2280
0x00000002 (PLTRELSZ) 11936 (bytes)
0x00000017 (JMPREL) 0x211b8
0x00000014 (PLTREL) REL
0x00000011 (REL) 0x1e020
0x00000012 (RELSZ) 12696 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffa (RELCOUNT) 341
0x00000006 (SYMTAB) 0x158
0x0000000b (SYMENT) 16 (bytes)
0x00000005 (STRTAB) 0xa3a8
0x0000000a (STRSZ) 55275 (bytes)
0x6ffffef5 (GNU_HASH) 0x17b94
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libglib-2.0.so.0]
0x00000001 (NEEDED) Shared library: [librt.so.1]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
...
0x0000000c (INIT) 0x24058
0x0000000d (FINI) 0xe2138
0x00000019 (INIT_ARRAY) 0x19f328
0x0000001b (INIT_ARRAYSZ) 16 (bytes)
0x0000001a (FINI_ARRAY) 0x19f338
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x00000016 (TEXTREL) 0x0
0x0000001e (FLAGS) TEXTREL
0x6ffffff0 (VERSYM) 0x1caf8
0x6ffffffc (VERDEF) 0x1df44
0x6ffffffd (VERDEFNUM) 1
0x6ffffffe (VERNEED) 0x1df60
0x6fffffff (VERNEEDNUM) 5
0x00000000 (NULL) 0x0

libtest.so.old
Dynamic section at offset 0x1915c0 contains 35 entries:
Tag Type Name/Value
0x00000003 (PLTGOT) 0x195f18
0x00000002 (PLTRELSZ) 11968 (bytes)
0x00000017 (JMPREL) 0x20630
0x00000014 (PLTREL) REL
0x00000011 (REL) 0x1d4b0
0x00000012 (RELSZ) 12672 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffa (RELCOUNT) 341
0x00000006 (SYMTAB) 0x158
0x0000000b (SYMENT) 16 (bytes)
0x00000005 (STRTAB) 0x9e38
0x0000000a (STRSZ) 54259 (bytes)
0x6ffffef5 (GNU_HASH) 0x1722c
...
0x0000000c (INIT) 0x234f0
0x0000000d (FINI) 0xd482c
0x00000019 (INIT_ARRAY) 0x192fb0
0x0000001b (INIT_ARRAYSZ) 16 (bytes)
0x0000001a (FINI_ARRAY) 0x192fc0
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x6ffffff0 (VERSYM) 0x1c038
0x6ffffffc (VERDEF) 0x1d3d4
0x6ffffffd (VERDEFNUM) 1
0x6ffffffe (VERNEED) 0x1d3f0
0x6fffffff (VERNEEDNUM) 5
0x00000000 (NULL) 0x0

执行如下命令查看目标文件的重定向类型,存在R_ARM_REL32说明定向存在偏移,
如果存在该重定向类型,还可以看到涉及的function,从这个function判断该功能出自哪个库
readelf -r libtest.so|grep R_ARM_REL32

如果使用-fPIC,这个函数的重定向类型是R_ARM_GLOB_DAT

3.解决,用新的编译工具使用-fPIC(-fpic -pie)选项重新编译相关依赖库文件,依赖库目标文件避免出现TEXTREL标识。

unexpected reloc type问题分析的更多相关文章

  1. Spring Cloud / Spring Boot There was an unexpected error (type=Unauthorized, status=401). Full authentication is required to access this resource.

    访问EndPoint时会出现没有权限   There was an unexpected error (type=Unauthorized, status=401). Full authenticat ...

  2. spring security There was an unexpected error (type=Forbidden, status=403).

    https://blog.csdn.net/qq_27093097/article/details/83190240 spring security There was an unexpected e ...

  3. There was an unexpected error (type=Method Not Allowed, status=405). Request method 'POST' not supported

    背景:点击提交按钮ajax请求接口时,报出错误[ Whitelabel Error Page This application has no explicit mapping for /error, ...

  4. SpringBoot-provider-JPA Not a managed type 问题分析及解决办法

    spring boot jpa-java.lang.IllegalArgumentException: Not a managed type异常问题解决方法 JPA实体类没有被扫描到,导致这样的情况有 ...

  5. 启动Springboot 报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sat Jan 12 15:50:25 CST 2019 There was an unexpected error (type=Not

    解决方案:http://www.cnblogs.com/michaelShao/p/6675186.html

  6. 【FFMPEG】【ARM-Linux开发】arm上安装FFMPEG

    交叉编译工具下载地址 : https://launchpad.net/linaro-toolchain-binaries/+download 其中我下载的是 : gcc-linaro-arm-linu ...

  7. jQuery静态方法type使用和源码分析

    jQuery.type方法是检测数据类型的工具方法,在分析其用法之前先总结下js给我们提供了那些监测数据类型的方法: 一.typeof 操作符 下面是测试代码 var data=[],a='123', ...

  8. 8、SpringMVC源码分析(3):分析ModelAndView的形成过程

    首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...

  9. 7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解

    从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, res ...

随机推荐

  1. 面试基础(二)-mem函数

    常考的函数有下面三个,memset,memcpy,memmove,一定要记住三个函数的函数原型,熟记返回值类型和参数类型,当然也不能忘记参数检查   memset #include<iostre ...

  2. 【阿里云产品公测】小白对OTS两点小建议

    作者:阿里云用户荷包蛋 我是大一的新生,作为一个爱技术爱学习爱折腾的熊孩子,我在暑假申请了ECS,学到了很多东西.现在阿里巴巴又开放了很多免费测试,我抱着学习和围观的心态申请了测试,其中有OTS这个高 ...

  3. Highcharts - Pie Chart

    1. 饼状图(Pie Chart)示例: <div id="container" style="height: 400px"></div> ...

  4. Business Component(BC)和Business Object(BO)

    Siebel应用架构的一个成功的地方就是在应用里引入了BC,BO的概念,从而使得几千张关系数据表能够按照业务的含义组织成业务对象,对于业务人员而言具有了业务上的含义,而不仅仅是从技术人员的观点来对待数 ...

  5. 爬虫入门之urllib库(一)

    1 爬虫概述 (1)互联网爬虫 一个程序,根据Url进行爬取网页,获取有用信息 (2)核心任务 爬取网页 解析数据 难点 :爬虫和反爬虫之间的博弈 (3)爬虫语言 php 多进程和多线程支持不好 ja ...

  6. Win7 自带FTP将文件复制到FTP服务器时发生错误。

    错误截图: 错误信息: 将文件复制到FTP服务器时发生错误.请检查是否有权限将文件放到该服务器上. 详细信息: 200 Type set to I. 200 PORT commad successfu ...

  7. GitLab 数据自动备份

    gitlab自动备份 周期性计划任务: crontab -e * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create service crond ...

  8. Python3基本数据类型(四、元组)

    Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号来表示. 一.创建元组 tup = ()#创建空元组 tup = ("ss",55,"aa& ...

  9. 如何在ubuntu上安装virtualbox的driver module vboxdrv

    干净的ubuntu安装完毕之后是没有vboxdrv这个driver module的. 新建一个folder jerry_virtualbox: 使用wget下载virtualbox安装包:https: ...

  10. 我是一只IT小小鸟读后感 Part 1

    我是一只IT小小鸟读后感 Part 1 梦断计院 作为一个工科生,真的和作者想到一块去了.在科大这个环境下,GPA成了衡量一个学生优秀与否的唯一因素,而真正对于编程和技术性的东西有兴趣的,往往被埋没在 ...