Linux 检查一个文件是静态链接还是动态链接的方法

news2024/11/24 19:06:40

一、file 指令示例

在 Linux 系统中,可以使用 file 命令 来查看一个可执行文件是静态链接的还是动态链接的。
使用方式

file executable_file

创建 hello_test.c 文件,测试代码如下:

#include <stdio.h>  

int main(void)
 {  
    printf("Hello, static world!\n");  
    return 0;  
}

使用 gcc 编译并静态链接 参数 -static ,指令如下:
生成一个静态链接的可执行文件

gcc -o static_hello hello_test.c -static

在这里插入图片描述
生成一个动态链接的可执行文件,指令如下:
使用 gcc 编译(默认是动态链接):

gcc -o dynamic_hello hello_test.c

在这里插入图片描述
使用 file 命令检查这两个可执行文件
静态可执行文件:

file static_hello

在这里插入图片描述

static_hello: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=bf3f1bd5a15d6f50850824876f45159efd39b596, not stripped

动态可执行文件:

file dynamic_hello

在这里插入图片描述

dynamic_hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=8fd973c9992d07615466b6e8fb785393ea8eb7c1, not stripped

二、ldd 命令

ldd 命令(list dynamic dependencies)用于打印共享库依赖关系。如果一个文件是动态链接的,ldd 将列出它依赖的所有共享库。如果文件是静态链接的,ldd 将无法找到任何依赖项,并可能返回一个错误消息,如“not a dynamic executable”或“not ELF executable”
使用方式

ldd executable_file

1.如果输出列出了共享库,那么文件是动态链接的。
2.如果输出显示“not a dynamic executable”或类似的消息,那么文件很可能是静态链接的。

静态可执行文件:

ldd static_hello

在这里插入图片描述
动态可执行文件:

ldd dynamic_hello

在这里插入图片描述

linux-vdso.so.1 (0x00007fff682f7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5f62e1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd5f68d4000)

三、readelf 命令

readelf 命令用于显示 ELF 格式文件的信息。可以使用它来检查文件的头部信息,特别是 interpreter 字段,该字段仅存在于动态链接的文件中

使用方式

readelf -l executable_file | grep 'interp'

1.如果找到了 Interpreter 字段,并且它指向了一个动态链接器(如 /lib64/ld-linux-x86-64.so.2),那么文件是动态链接的。
2.如果没有找到 interpreter 字段,那么文件很可能是静态链接的。

静态可执行文件:

readelf -a static_hello
readelf -l static_hello 
readelf -l static_hello | grep 'interp'
readelf -l static_hello | grep interp

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

动态可执行文件:

readelf -a dynamic_hello 
readelf -l dynamic_hello 
readelf -l dynamic_hello | grep 'interp'
readelf -l dynamic_hello | grep interp

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、objdump 命令

objdump 命令是另一个用于显示二进制文件信息的工具。可以使用它来检查文件的头部,特别是动态链接标志。

使用方式

objdump -p executable_file | grep 'DYNAMIC'

静态可执行文件:

objdump -p static_hello | grep 'DYNAMIC'
objdump -T static_hello

在这里插入图片描述
在这里插入图片描述

动态可执行文件:

objdump -p dynamic_hello | grep 'DYNAMIC'
objdump -T dynamic_hello

在这里插入图片描述
在这里插入图片描述

通常 file 命令足以确定一个文件是静态链接还是动态链接的,但其他工具如 lddreadelfobjdump 提供了文件更详细的信息,可以更深入地了解文件的结构和依赖关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2195350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xss-labs靶场第一关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、注入点寻找 2、使用hackbar进行payload测试 3、绕过结果 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机&#xff1a;本机(127.0.0.1) 靶 机&#xff1a;本机(127.0.0.…

2-115 基于matlab的瞬态提取变换(TET)时频分析

基于matlab的瞬态提取变换&#xff08;TET&#xff09;时频分析&#xff0c;瞬态提取变换是一种比较新的TFA方法。该方法的分辨率较高&#xff0c;能够较好地提取出故障的瞬态特征&#xff0c;用于故障诊断领域。通过对原始振动信号设置不同信噪比噪声&#xff0c;对该方法的抗…

国庆作业

day1 1.开发环境 Linux系统GCCFDBmakefilesqlite3 2.功能描述 项目功能: 服务器&#xff1a;处理客户端的请求&#xff0c;并将数据存入数据库中&#xff0c;客户端请求的数据从数据库进行获取&#xff0c;服务器转发给客户端。 用户客户端&#xff1a;实现账号的注册、登…

draw.io 设置默认字体及添加常用字体

需求描述 draw.io 是一个比较好的开源免费画图软件。但是其添加容器或者文本框时默认的字体是 Helvetica&#xff0c;一般的期刊、会议论文或者学位论文要求的英文字体是 Times New Roman&#xff0c;中文字体是 宋体&#xff0c;所以一般需要在文本字体选项里的下拉列表选择 …

2024 全新洞察:性格色彩报告 API 接口登场

近年来&#xff0c;人工智能技术的快速发展与应用&#xff0c;为我们的生活带来了诸多便利。其中&#xff0c;性格色彩报告 API 接口的登场&#xff0c;无疑是为我们了解自身性格特点提供了一种全新的方式。 性格色彩报告 API 接口&#xff0c;是一项基于性格色彩题库答案的技…

鸿蒙next开启地图服务

一般手机软件有的都会有开启地图功能&#xff0c;这里说一下怎么开启地图服务 1、 首先你需要配置一些东西&#xff0c;在华为的agc平台上&#xff0c;下边链接就是详细的教程 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/map-config-agc-V5 我说一下你…

基于LORA的一主多从监测系统_框架搭建

第一节、框架搭建 打开CubeMAX&#xff0c;选择好芯片&#xff0c;进行基础配置 第一步、先配置时钟源 第二步、配置SYS选项 配置debug口以及计数器源&#xff0c;我这里选择TIM1 第三步、选择I2C接口 配置如下即可&#xff0c;默认配置不用改 第四步、串口选择 我们这里使…

2024年超火的AI绘画项目,多重变现方法,日赚1000+

一&#xff0e;项目介绍 绘画是一个很大的领域&#xff0c;今天讲是壁纸头像类的细分赛道&#xff0c;它可以说是一个经久不衰的项目。今年最火的项目肯定是AI&#xff0c;这个项目的核心是将AI生成的头像或壁纸上传到抖音或其他平台上进行变现。这个项目的变现渠道非常多&…

基于STM32的智能台灯设计

1. 设计目的与意义 1.1设计目的 设计一个采用220v交流电进行供电&#xff0c;具备显示屏能够实时显示日期&#xff08;年、月、日和星期&#xff09;&#xff0c;时间&#xff08;小时、分钟、秒&#xff09;和温度&#xff08;摄氏度&#xff09;&#xff0c;能够通过语音交…

github项目——howtocook

github偶然发现的一个项目&#xff0c;无关编程 &#xff0c;只教你做菜&#x1f602; 参与其中&#xff0c;简历就可以写上github热门项目贡献者&#x1f602; 66.7K stars,深的程序员喜爱&#xff01;甚至搞了个专门的域名网站。。。 菜品还有专门的配图和难度系数&#xff0…

水务行业的数字化转型之路:四大挑战与展望

随着数字时代的全面到来&#xff0c;各行各业都在积极探索数字化转型的路径&#xff0c;而作为国民经济命脉之一的水务行业也不例外。水务行业的数字化转型不仅是技术革新的必然趋势&#xff0c;更是提升水资源管理效率、保障水安全、促进生态文明建设的关键举措。然而&#xf…

tick数据合成k线的完整过程(含源代码)

tick数据合成k线的完整过程&#xff08;含源代码&#xff09; 写在前面tick 数据的选择行情结构体字段tick 行情示例 批量合成1分钟k线方式增量合成1分钟k线方式k线分钟级别扩展源码获取方式 写在前面 码上君量化互助社群已建立&#xff0c;所有源码免费对社群成员开放&#x…

鹏哥C语言自定义笔记重点(79-)

79.动态内存管理 80.使用动态内存管理的常见问题 对5的问题修改: 内存泄露的第一种可能: 第二种可能: 81.下面程序可能出现的问题 解决问题的两种方法: 82. 都是会造成野指针 83.p里面的内容不能进入Test 84.内存泄露问题 85.野指针问题:malloc创建的空间销毁了&#xff0c;但…

关于ad 的焊盘自动排序功能说明

你是不是想&#xff0c;不想手动一个一个改焊盘的号数&#xff0c;真的很累&#xff0c;对吧 那么下来看看&#xff0c;关于这个的用法的说明 比如我要改这个红色框中的焊盘的序号&#xff0c;那么我们就先框选好&#xff0c;来到右边的栏目&#xff0c;看到红色圈出的地方&am…

算法工程师重生之第二十二天(递增子序列 全排列 全排列 II 重新安排行程 N皇后 解数独 总结 )

参考文献 代码随想录 一、非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作…

数据结构(7.4_3)——B+树

B树的定义&#xff1a; B树的查找&#xff1a; 查找成功时&#xff1a; 查找失败时&#xff1a; B树和B树的比较 总结&#xff1a;

AI写作工具大比拼:揭秘Claude的神秘魅力以及如何订阅Claude

AI写作困境与Claude的惊喜表现 最近有很多朋友在吐槽AI写的文章不太行&#xff0c;我一看他的要求写的很清楚&#xff0c;已经把提示词都用到位了&#xff0c;例如&#xff1a;写作背景、写作要求等&#xff0c;都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有遇到…

基于LORA的一主多从监测系统_前言

第一章、前言 最近想用手头的东西做一个小项目&#xff0c;也算是一个共用框架&#xff0c;这个框架可以做很多东西&#xff0c;比如基于lora的智慧农场&#xff0c;基于lora的智慧牧场&#xff0c;基于lora的智慧城市&#xff0c;智慧矿井等。 这个项目我对他的定位是可以用…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态&#xff1a;READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换&#xff1a;点击开始游戏&#xff08;从READY变为RUNNING&am…

RL_足球教练

文章目录 前言什么是 Agent?定义Agent的组成部分Agent的目标 什么是 End-to-End Approach?定义特点优势与挑战示例 Fuzzy Bayesian Reinforcement Learning (RB-RL)系统组成部分系统工作原理 贝叶斯方法基础_条件概率定义 贝叶斯定理示例敏感性 Q-learning强化学习算法Q-lear…