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

相关文章

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序