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

相关文章

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

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

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

Maven项目打包时添加本地Jar包的操作步骤

《Maven项目打包时添加本地Jar包的操作步骤》在Maven项目开发中,我们经常会遇到需要引入本地Jar包的场景,比如使用未发布到中央仓库的第三方库或者处理版本冲突的依赖项,本文将详细介绍如何通过M... 目录一、适用场景说明​二、核心操作命令​1. 命令格式解析​2. 实战案例演示​三、项目配置步骤​1

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动