运行时和编译时使用的so库不同是否影响可执行文件执行

引子

        近日遇到如下问题:

        1.如果可执行文件依赖的so库在编译和执行阶段使用的名字一样,但是内容不一样,比如运行时相比于编译时在so库里增加了几个api定义,so库还可以正常使用吗?

        2.如果可执行文件依赖的so库在编译和执行阶段使用的名字一样,但是调用的api运行时相比于编译时定义发生了改变,api可以正常调用吗?

先上结论

        只要引用的api的类型没发生改变(返回类型,参数类型),即使引用的api内容发生了改变或者api在so库的位置发生了改变。可执行文件仍然可以正常引用。      

    可执行文件里只记录了so库的api的符号引用,在引用时不会校验api的大小,内容,所以即使api的内容或者位置发生改变,但只要类型不改变,就可以。      

    因为动态链接的过程涉及到符号解析和地址重定位。当可执行文件和动态库被编译时,编译器并不将函数的实际地址硬编码到可执行文件中。相反,它会在可执行文件中放置一个符号引用。在程序运行时,动态链接器(通常是 ld-linux.so)负责查找这些符号的实际地址,并进行重定位,以确保函数调用能够正确地定位到动态库中的相应函数。

代码实测

测试代码fun1.c

#include<stdio.h>void testOne(){printf("enter testOne!\n");
}void testTwo(){printf("enter testTwo!\n");
}

fun2.c

#include<stdio.h>void testThree(){printf("enter testThree!\n");
}void testFour(){printf("enter testFour!\n");
}

fun1.h

#pragma once 
int testOne();
void testTwo();

fun2.h

#pragma once 
void testThree();
void testFour();

将fun1.c,fun2.c编译为一个so

gcc -c -fpic fun1.c -o fun1.o //

gcc -c -fpic fun2.c -o fun2.o //

gcc -shared -o libfun.so fun1.o fun2.o

可执行文件测试main.c

#include"fun1.h"
#include"fun2.h"
#include<stdio.h>int main(){printf("11\n");testOne();printf("22\n");testThree();return 0;
}

生成可执行文件:

gcc -o test main.c -I/workspace/codeAD/test/testSo -L/workspace/codeAD/test/testSo -lfun

readelf -d ./test

 可以看到可执行文件依赖的so库,libfun.so libc.so

可执行文件执行

修改fun1.c,增加一个testZero的api,同时修改testOne定义,但是testOne类型不变

fun1.c

#include<stdio.h>void testZero(){printf("enter testOne!\n");
}void testOne(){printf("enter testOne!\n");printf("enter testOne testOne!\n");
}void testTwo(){printf("enter testTwo!\n");
}

重新编译fun1.o和libfun.so,fun2.o和可执行文件test不重新编译。

对比前后两个libfun.so,可以看到testOne这个api的value(value就是entry,入口点,可以大概理解为so库呗加载到内存后,此api相比于so库首地址的offset),size都发生了变化,但是符号引用没变。

再次运行可执行文件test,可以看到testOne接口被成功调用,使用了新的定义。

结论:只要api的类型不发生改变,即使运行时so库的接口相比于编译时定义和位置发生了改变,也不影响api调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/297118.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python与COM组件在Zemax中的高效交互指南

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python与COM组件在Zemax中的高效交互指南。全文4600字&#xff0c;阅读大约15分钟 Zemax是一款用于光学设计和仿真的强大工具&#xff0c;而Python作为一种通用性语言&#…

前端扫盲:什么是API网关?为什么它有用?

API 通常被称为应用程序从后端服务访问数据和业务逻辑的前门。API 本质上是一个软件向其他人或程序提供的接口&#xff0c;允许他们与该软件进行交互。 在创建 API 时&#xff0c;需要选择编程语言(Java、Python、PHP 等)来编写 API 逻辑&#xff0c;还需要将 API 部署到服务器…

3.认识HTML

一、HTML是什么&#xff1f; 超&#xff1a;超链接 二、W3C制定了HTML规范 2014年HTML5正式发布 三、HTML初体验 四、老师常用网站

WorkPlus Meet实现企业局域网视频会议的领先解决方案

在当今全球化的商业环境中&#xff0c;视频会议已成为企业高效沟通协作的重要工具。而在企业内部&#xff0c;局域网视频会议系统则具备更高的安全性和稳定性。WorkPlus Meet作为一种全新选择的局域网视频会议系统&#xff0c;以其卓越的性能和领先的技术&#xff0c;为企业打造…

29.Java程序设计-基于Springboot的幼儿园管理系统的设计与实现

1. 引言 背景介绍&#xff1a;幼儿园管理系统的必要性和重要性。研究目的&#xff1a;设计一个基于Spring Boot的系统以优化幼儿园管理流程。论文结构概览。 2. 需求分析 用户需求&#xff1a;不同用户&#xff08;管理员、老师、家长&#xff09;的需求分析。功能需求&…

Linux入门攻坚——9、Linux程序包管理-1

Linux程序包管理&#xff08;1&#xff09; 如何在Linux上安装、查询、卸载、升级程序&#xff08;对于使用者很重要的知识点&#xff0c;使用Linux就是要使用其上的程序&#xff0c;如果程序都安装不上&#xff0c;谈何使用&#xff09; 程序从源代码到最终能够执行的代码需…

RabbmitMQ基础

RabbmitMQ基础 1.1 什么是MQ MQ(Message Queue)&#xff0c;从字面意思看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;队列中存放的是message。是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;MQ是一种非常常见的上下游…

使用Open3D实现3D激光雷达可视化:以自动驾驶的2DKITTI深度框架为例(下篇)

原创 | 文 BFT机器人 【原文链接】使用Open3D实现3D激光雷达可视化&#xff1a;以自动驾驶的2DKITTI深度框架为例&#xff08;上篇&#xff09; 05 Open3D可视化工具 多功能且高效的3D数据处理&#xff1a;Open3D是一个全面的开源库&#xff0c;为3D数据处理提供强大的解决方…

MOSFET管驱动设计细节,波形分析

MOSFET管驱动设计细节,波形分析 Chapter1 MOSFET管驱动设计细节,波形分析MOSFET驱动芯片的内部结构MOS驱动电路设计需要注意的地方MOS管驱动电路参考MOS管驱动电路的布线设计常见的MOS管驱动波形高频振铃严重的毁容方波又胖又圆的肥猪波打肿脸充正弦的生于方波他们家的三角波大…

企业知识库在跨地域团队协作中的价值

随着全球化进程的不断加速&#xff0c;越来越多的企业开始面临跨地域协作的挑战。在这种背景下&#xff0c;企业知识库作为一种重要的知识管理工具&#xff0c;对于提高团队协作效率、促进知识共享与创新具有不可替代的价值。接下来就说一下知识库在跨地域团队协作中的重要性及…

条款 10:令 operator= 返回一个指向 *this 的引用

赋值的一个有趣之处在于&#xff0c;可以将它们串在一起: int x, y, z; x y z 15; // 将赋值运算串起来// x (y (z 15));实现这种操作的方式是&#xff0c;赋值操作返回一个指向左侧参数的引用。 自定义的类&#xff0c;实现赋值操作符时应该遵循这个约定&#xff1a; …

Tauri:构建高效安全的桌面应用程序 | 开源日报 No.124

tauri-apps/tauri Stars: 64.6k License: Apache-2.0 Tauri 是一个开源项目&#xff0c;它可以通过 Web 前端构建更小、更快和更安全的桌面应用程序。 该项目具有以下优势和特点&#xff1a; Tauri 可以帮助用户构建桌面应用程序&#xff0c;并使用 web 前端技术进行界面设计…