首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 可执行文件 so

Linux 可执行文件 .so

基础概念

.so 文件是 Linux 系统中的共享库(Shared Object)文件,也称为动态链接库(Dynamic Link Library)。它们包含了可以被多个程序同时使用的代码和数据。共享库的主要目的是提高代码的重用性和减少内存占用。

相关优势

  1. 代码重用:多个程序可以共享同一个库文件,避免了代码的重复。
  2. 动态链接:程序在运行时才加载库文件,节省了内存空间。
  3. 易于更新:只需替换库文件,而不需要重新编译和安装所有依赖该库的程序。
  4. 跨平台兼容性:共享库可以在不同的系统和架构之间共享。

类型

  • 静态库.a):编译时链接,整个库文件会被复制到可执行文件中。
  • 动态库.so):运行时链接,库文件在程序启动时加载。

应用场景

  • 大型软件系统:如操作系统内核、数据库管理系统等。
  • 框架和库:如 GTK+、Qt、OpenCV 等。
  • 插件系统:允许第三方开发者扩展软件功能。

遇到的问题及解决方法

问题1:找不到共享库文件

原因:程序在运行时无法找到所需的 .so 文件。

解决方法

  1. 确保库文件存在于系统中,并且路径正确。
  2. 使用 ldconfig 命令更新库缓存。
  3. 在程序中使用 -rpath 编译选项指定库路径。
代码语言:txt
复制
# 示例:编译时指定库路径
gcc -o myprogram myprogram.c -L/path/to/libraries -lmylib -Wl,-rpath=/path/to/libraries
问题2:版本冲突

原因:系统中存在多个版本的库文件,导致程序加载错误的版本。

解决方法

  1. 使用包管理工具(如 aptyum)安装特定版本的库。
  2. 使用虚拟环境(如 conda)隔离不同项目的依赖。
  3. 在程序中使用 -l:libname.so.version 明确指定库的版本。
代码语言:txt
复制
# 示例:明确指定库版本
gcc -o myprogram myprogram.c -l:libmylib.so.1.2
问题3:权限问题

原因:当前用户没有权限访问库文件。

解决方法

  1. 检查库文件的权限设置,确保当前用户有读取权限。
  2. 使用 chmod 命令修改文件权限。
代码语言:txt
复制
# 示例:修改文件权限
chmod 755 /path/to/libmylib.so

示例代码

以下是一个简单的示例,展示如何在 C 程序中使用共享库:

库文件 (libmylib.c)

代码语言:txt
复制
#include <stdio.h>

void hello() {
    printf("Hello from shared library!\n");
}

编译库文件

代码语言:txt
复制
gcc -shared -o libmylib.so libmylib.c

主程序 (main.c)

代码语言:txt
复制
extern void hello();

int main() {
    hello();
    return 0;
}

编译主程序并链接库文件

代码语言:txt
复制
gcc -o main main.c -L. -lmylib -Wl,-rpath=.

运行程序

代码语言:txt
复制
./main

通过以上步骤,你可以成功创建和使用一个简单的共享库。希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • linux 什么是SO文件

    下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。   ...在Linux中,应用程序通过使用soname,来指定所希望库的版本,库作者可以通过保留或改变soname来声明,哪些版本是兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。...下面的还没细看,汗 4.库的初始化,解析: windows下的动态库加载,卸载都会有初始化函数以及卸载函数来完成库的初始化以及资源回收,linux当然也可以实现。.../ts 关键就在LD_PRELOAD上了,这个路径指定的so将在所有的so之前加载,并且符号会覆盖后面加载的so文件中的符号。如果可执行文件的权限不合适(SID),这个变量会被忽略。 执行:.

    5.8K20

    linux的so注入与热更新原理

    简介 之前写了个hookso的工具,用来操作linux进程的动态链接库行为,本文从so注入与热更新入手,简单讲解一下其中的原理,配合源码阅读效果更佳。...这里要介绍一下linux的ptrace函数。...函数查找 我们知道,linux的可执行文件是elf文件格式,动态链接库其实也是elf格式。关于elf,有很多资料,这里简单讲一下elf结构。...(实际上linux各种运行时库的版本也很难受) 为什么不做成机器码直接jmp就好了? 机器码里直接jmp,但是事先不知道目标地址,所以只能填空,这样又不好与正常代码区分。...通过查阅资料可知,linux amd64调用函数,用到的寄存器及含义如下: rdi:参数1 rsi:参数2 rdx:参数3 rcx:参数4 r8:参数5 r9:参数6 rax:函数地址 rbp:栈底地址

    11.8K51

    Linux系统创建可执行文件软链接

    这里我们使用的案例是通过TMalign这个蛋白质打分文件,在编译好可执行文件之后,可以使用建立软链接的方法快捷的使用该可执行文件。...Mac可能需要去掉static): $ g++ -static -O3 -ffast-math -lm -o TMalign TMalign.cpp 编译之后就会在当前路径下生成一个名为TMalign的可执行文件...,有时候会遇到想把可执行文件放在特定的路径下的问题,比如放到/usr/bin目录下,这样可以全局可调用,又不需要手动添加各种乱七八糟的系统路径。...这就需要使用到Linux中的软链接的功能,通常使用ln -s的指令即可。...本文顺带介绍了蛋白质结构评分软件TMalign的源码下载和安装使用的基本方法,编译成一个可执行文件后,可以建立一个软链接,在系统各处都可以使用,是一个比较基础的操作。

    2.8K20

    Manjaro Linux平台用pyinstaller打包python可执行文件

    对于使用场景不是很复杂的,我们可以直接做成一个可执行文件,这样开发者只需要维护可执行文件的功能正常,以及对于各种平台的兼容性较好,这就可以了。...这里我们介绍如何使用pyinstaller去通过python源码构造一个可执行文件。...Doing additional searching... 6315 INFO: Using Python library /home/dechin/anaconda3/lib/libpython3.8.so...最常用的方法其实是直接将该可执行文件拷贝到/usr/bin/目录下,这样该可执行文件就可以直接使用,BLACKPINK不需要在前面加上路径就能运行。...总结概要 通过pyinstaller我们可以将一个python项目打包编译构建成一个可执行文件,然后将该可执行文件放置到一个系统路径下,使得系统可以不需要路径也能够识别到这个可执行文件,这样我们就可以仅配置一些输入文件或者命令行的入参

    2.9K00

    反编译so库破解so

    所以想破解so,将对i2c num 的大小改大点。...from=sec (2)实战预热 https://blog.csdn.net/m0_37766442/article/details/72903385 一、反编译so 使用IDA打开so 根据log信息或猜测查找需要破解的大致位置...我们看到上方有一个 loc_82036,这代表一段代码的标签处,类似C里面goto 的标签,那肯定其他地方会向这个标签做跳转 选中这个标签,右击 点击红框选项,就会列出所有向此处跳转的地方,这个so,...点中CMP R0,#6的地址处,然后切换到HEX View Hex VIEW 可以切换数据格式,64位so用4字节格式,32位so用2字节格式 我们需要将CMP R0,#6 改成CMP R0,#8...,跳转到这一地址 我们将06改成08保存 替换so,不再打印那个错误log,读正常了,但是写还有问题,同样的方法修改I2C写操作里的值,问题解决 发布者:全栈程序员栈长,转载请注明出处:https:

    4.7K30

    【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )

    文章目录 一、Android 虚拟机涉及的 libdvm.so 动态库 和 libart.so 动态库 二、Android 运行时相关 libandroid_runtime.so 动态库 三、Android...Framework 层 Native 实现相关 libandroidfw.so 动态库 一、Android 虚拟机涉及的 libdvm.so 动态库 和 libart.so 动态库 ---- libdvm.so...; 执行 cp /system/lib/libart.so /sdcard/Pictures 命令 , 将 libart.so 动态库拷贝到 /sdcard/Pictures 目录 , 之后可以将其拷贝到文件系统..., 使用 64 位 IDA 分析该动态库 ; 二、Android 运行时相关 libandroid_runtime.so 动态库 ---- libandroid_runtime.so 是 Android...层的 Native 实现部分的动态库 , 执行 cp /system/lib/libandroidfw.so /sdcard/Pictures 命令 , 将 libandroidfw.so 动态库拷贝到

    3K20
    领券