首页 > 系统相关 >Linux so文件

Linux so文件

时间:2023-12-25 16:22:22浏览次数:42  
标签:文件 sub int add SO Linux so calc

https://www.python100.com/html/I3T3M93XN47U.html

一、什么是SO文件

SO文件(Shared Object),也被称为共享库、动态链接库,是一种在Linux系统中使用的二进制文件。它包含了可重用的代码、数据和函数等,可以由多个程序同时使用,以节省空间。

SO文件是一个编译好的目标文件,其中包含了可供程序调用的函数和变量。相比于静态库,SO文件不会在程序运行时被全部载入,而是等到程序需要时才被动态链接到内存中。

SO文件的特点是能够减少文件体积,提高代码复用率和程序运行速度。因此,开发者经常将一些常用或大型的代码库编译成SO文件,提供给其他应用程序使用。

二、SO文件的使用场景

SO文件的使用场景非常广泛,在以下领域中有着重要作用:

1. 操作系统核心

许多操作系统核心中的组件,例如驱动程序、进程管理器、系统调用库等,都使用SO文件的形式进行部署。这可以使得操作系统核心在运行时更加高效,同时减小体积。

2. 开发语言的库和框架

许多开发语言(例如C、C++、Python等)都使用SO文件编写并部署其相关库和框架。这些SO文件可以共享在多个项目中使用,可以提高代码的可重用性。

3. 应用程序

许多应用程序在编译时会链接一些SO文件,这些SO文件提供了一些共享库和逆向工具,使得开发者可以更加高效完成工作。在Linux系统的运行时中,也会动态加载一些SO文件,以提供一些必要的系统服务。

三、如何编写和使用SO文件

1. 编写SO文件

下面是一个简单的使用C语言编写的SO文件示例:

// calc.c
int add(int a, int b){
    return a + b;
}
int sub(int a, int b){
    return a - b;
}

使用下面的命令编译生成SO文件:

gcc -o libcalc.so -shared calc.c

其中,-shared参数表示生成SO文件;-o参数指定输出文件的名称。

2. 使用SO文件

在C语言中,使用SO文件的过程分为两个步骤:链接和加载。

在链接时,需要在编译命令中添加链接选项-l和-l参数后的库名,例如:

gcc -o main main.c -L. -lcalc

其中,-L参数指定SO文件路径;-l参数后面跟库名,不需要包含lib前缀和.so后缀。

在程序运行时,系统调用库函数dlopen()和dlsym()函数来加载和调用SO文件中定义的函数。

// main.c
#include <stdio.h>
#include <dlfcn.h>

int main(){
    void* handle = dlopen("./libcalc.so", RTLD_NOW);
    if(!handle){
        printf("Load library error: %s\n", dlerror());
        return 1;
    }

    int (*calc_add)(int, int) = dlsym(handle, "add");
    int (*calc_sub)(int, int) = dlsym(handle, "sub");
    if(!calc_add || !calc_sub){
        printf("Load symbol error: %s\n", dlerror());
        return 1;
    }

    printf("add(3, 4)=%d\n", calc_add(3, 4));
    printf("sub(3, 4)=%d\n", calc_sub(3, 4));

    dlclose(handle);

    return 0;
}

以上代码中,dlopen()函数加载SO文件;dlsym()函数获取SO文件中函数的地址,以便调用;dlclose()函数释放资源。

四、总结

SO文件是Linux系统中重要的组成部分,它可以提高代码复用率和程序运行效率。开发者可以通过编写和使用SO文件,实现高效、可维护的软件开发。

标签:文件,sub,int,add,SO,Linux,so,calc
From: https://www.cnblogs.com/direwolf22/p/17926327.html

相关文章

  • unigui显示websocket服务端向客户端发送信息【15】
    用WebSocket从服务端直接发送消息给all客户端。1、在ServerModule放TUniThreadTimer 2、timerevent:procedureTUniServerModule.UniThreadTimer1Timer(Sender:TObject);beginBroadcastMessage('update',[......
  • Linux (8) unbound配置转发域
    《WindowsAzurePlatform系列文章目录》本文介绍如何使用AzureLinux设置unbound本地转发和转发域。1.我们可以通过下面的命令,安装unboundyuminstallunbound-y2.启动unboundsystemctlstartunbound3.设置开机自动启动:systemctlenableunbo......
  • JAVA TSV文件的解析与生成
    TSV文件与CSV文件的区别TSV为用制表符tab分隔的文本文件。CSV为用逗号,分隔的文本文件。TSV文件的打开方式1.使用nodepad++等文本工具打开,使用记事本打开会导致某些行的格式错误。2.打开一个Excel,直接将tsv文件拖进去即可。JAVATSV文件的解析1.添加univocity-parsersjar包依赖 ......
  • kafka 开启JMX监控(windows、linux)
    1.情景展示使用EFAK监控kafka的运行状态,需要kafka开启JMX监控。如何开启?2.windows来到KAFKA_HOME/bin/windows目录下。找到:kafka-server-start.bat,右键-->编辑。找到:IF["%KAFKA_HEAP_OPTS%"]EQU[""](我们可以看出,不同位数,走的不同配置。现在大部分电脑都是64位的......
  • SOJ1972 题解
    题意设\(S\)为一个可重数集,满足所有元素均为非负整数。你可以对\(S\)进行若干次(可以为\(0\)次)如下操作:选择一个非负整数\(x\)满足\(x\)至少在\(S\)中出现了\(2\)次,在\(S\)中删除一个\(x\),并将\((x-1)\)或\((x+1)\)插入\(S\)。如果你选择插入\((x-1)\),你必......
  • html5中怎么实现多文件上传功能
    本篇文章为大家展示了html5中怎么实现多文件上传功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。主要用到的是<input>的multiple属性代码如下:<inputtype="file"name="multipleFileUpload"multiple/>下面是页面的详细代码:代码......
  • Linux 安装Apache
    Apache版本说明Apache的版本由三部分组成:主版本号+次版本号+修订版本号主版本号:如果主版本号不同,通常涉及重大变更或重大功能升级次版本号:表示在主版本下的重要更新。奇数表示开发和测试版本。如果是偶数表明是稳定版本。修订版本:通常是针对特定错误修复、安全修补或小......
  • :联塑LESSO、JSPES品升、美尔固MIERGU、索邦管Suban、龙胜管LS、亚通Aton、伟星vasen、
    写文章  最新水管品牌十大排行榜发布(Maigoo)买购网MAIGOO知识榜品牌榜查排行上买购网​关注 水管管道什么牌子好?经专业评测的2023年水管管道十大品牌名单发布啦!居前十的有:联塑LESSO、JSPES品升、美尔固MIERGU、索邦管Suban、龙胜管LS、亚通......
  • VS2022远程调试Linux程序卡住问题解决
    问题:说明:使用vs2022第一次远程调试linux上的程序时,会出现调试器启动时卡住问题。原因就是第一次调试时,会在目标服务器下下载vsdbg工具,因为下载源在国外,所以下载特别慢,就会造成卡住的现象。解决:uname-m 查看远程调试时,用户文件夹下会多一个.vs-debugger隐藏文件夹,如果是使用......
  • SARscape导入哨兵1数据自动读取本地轨道文件
    电脑联网时,SARscape导入哨兵1数据时可自动从网上下载相应数据的轨道文件并在导入时使用。在导入后生成的.sml文件中查找ORBIT_FILE_NAME字段包含如下信息,说明导入时使用了自动下载的轨道文件并存放于临时路径中。最近,欧空局下载轨道文件的API发生了变化,SARscape中导入哨兵1数据......