binutils——如何将程序打包为库文件

2024-01-11 02:38
文章标签 程序 打包 binutils 为库

本文主要是介绍binutils——如何将程序打包为库文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      • 静态库文件
      • 动态库文件
      • 静态库与动态库的区别

在我们开发项目过程中。经常会遇到使用第三方程序的情况。而这个时候我们只需要调用第三方提供的库文件和接口文档就可以了,我们并看不到源代码。而这个库文件又是许多源文件编译得来的。

问题:我们如何将多个源文件打包成一个库文件呢?

静态库文件

  • 由链接器在链接时将库的内容直接加入到可执行程序中。
  • Linux下静态库的创建和使用
    1. 编译静态库源码:gcc –c lib.c –o lib.o
    2. 生成静态库文件: ar –q lib.a lib.o
    3. 使用静态库编译: gcc main.c lib.a –o main.out

操作过程:

delphi@delphi-vm:~/workspace$ gcc -c dlib.c -o slib.o <--1
delphi@delphi-vm:~/workspace$ ls
slib.c  slib.o  main.c
delphi@delphi-vm:~/workspace$ ar -q dlib.a slib.o <--2
ar: creating slib.a
delphi@delphi-vm:~/workspace$ ls
slib.a  slib.c  slib.o  main.c
delphi@delphi-vm:~/workspace$ gcc main.c slib.a -o main.out <--3
delphi@delphi-vm:~/workspace$ ls
slib.a  slib.c  slib.o  main.c  main.out
delphi@delphi-vm:~/workspace$ rm slib.c slib.o
delphi@delphi-vm:~/workspace$ rm slib.a main.c
delphi@delphi-vm:~/workspace$ ls
main.out
delphi@delphi-vm:~/workspace$ ./main.out 
Name: Static Lib
Result: 5

我们知道:
当可执行程序需要与静态库进行链接时,所使用到的库中的函数和数据会被拷贝到最终的可执行文件中。(并不是库文件全部装入到可执行文件,而是用到哪些函数就装入哪些函数)。

问题:那么多个可执行程序都需要用到同一个静态库文件,岂不是每个可执行文件都存在库文件的拷贝?

动态库文件

  • 可执行程序在运行时才动态加载库进行链接
  • 库的内容不会进入可执行程序当中
  • Linux下动态库的创建和使用
    1. 编译动态库源码:gcc –shared dlib.c –o dlib.so
    2. 使用动态库编译:gcc main.c –ldl –o main.out
    3. 关键系统调用
      a) dlopen:打开动态库文件
      b) dlsym:查找动态库中的函数并返回调用地址
      c) dlclose:关闭动态库文件

示例代码:动态库链接示例

#include <stdio.h>
#include <dlfcn.h>int main()
{void* pdlib = dlopen("./dlib.so", RTLD_LAZY);char* (*pname)();int (*padd)(int, int);if( pdlib != NULL ){pname = dlsym(pdlib, "name");padd = dlsym(pdlib, "add");if( (pname != NULL) && (padd != NULL) ){printf("Name: %s\n", pname());printf("Result: %d\n", padd(2, 3));}dlclose(pdlib);}else{printf("Cannot open lib ...\n");}return 0;
}

操作过程:
delphi@delphi-vm:~/workspace$ gcc -shared dlib.c -o dlib.so
delphi@delphi-vm:~/workspace\$ gcc main.c -ldl -o test.out
delphi@delphi-vm:~/workspace\$ rm dlib.c dlib.so main.c
delphi@delphi-vm:~/workspace\$ ls
main.out test.out
delphi@delphi-vm:~/workspace\$ ./test.out
Cannot open lib …
delphi@delphi-vm:~/workspace\$ gcc -shared dlib.c -o dlib.so
delphi@delphi-vm:~/workspace\$ ./test.out
Name: Dynamic Lib
Result: 5

静态库与动态库的区别

  • 静态库:目标文件直接链接进入可执行程序
  • 动态库:在程序启动后才动态加载目标文件

也就是说,通过静态链接的目标文件,在运行时可以不需要静态库文件的存在;而通过动态链接的目标文件,则需要动态库文件的存在才可以运行,否则则提示:Cannot open lib。。。。

  • 动态链接可执行文件比功能相同的静态链接可执行文件体积小。它能够节省磁盘空间和虚拟内存,因为函数库只有在需要时才被映射到进程中。
  • 所有动态链接到某个特定库函数的可执行文件在运行时共享该函数库的一个单独拷贝。

这里写图片描述

这篇关于binutils——如何将程序打包为库文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592872

相关文章

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

linux打包解压命令方式

《linux打包解压命令方式》文章介绍了Linux系统中常用的打包和解压命令,包括tar和zip,使用tar命令可以创建和解压tar格式的归档文件,使用zip命令可以创建和解压zip格式的压缩文件,每... 目录Lijavascriptnux 打包和解压命令打包命令解压命令总结linux 打包和解压命令打

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

Python项目打包部署到服务器的实现

《Python项目打包部署到服务器的实现》本文主要介绍了PyCharm和Ubuntu服务器部署Python项目,包括打包、上传、安装和设置自启动服务的步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录一、准备工作二、项目打包三、部署到服务器四、设置服务自启动一、准备工作开发环境:本文以PyChar

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(