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创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

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