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

linux下的soo、lo、a、la文件的区别

o: 编译的目标文件 a: 静态库,其实就是把若干o文件打了个包 so: 动态链接库(共享库) lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息 la: 使用libtool编译出的库文件...libtool只后缀名为lo、la为的libtool文件打交道。...考虑以下情况:要从myprog.o文件编译生成myprog,其依赖于库liba.so(使用libtool生成),liba.so又依赖于libb.so(libb.so的生成不使用libtool),而且由于某种原因...gcc命令行类似于下面: gcc –o myprog /usr/lib/liba.so 由于liba.so依赖于libb.so(这种依赖可以用readelf读liba.so的...$ unicore32-Linux-gcc –o myprog /usr/lib/liba.so \ -Wl,–rpath-link -Wl,/home/UNITY_float/install/usr/

8.8K30

linuxso注入热更新原理

简介 之前写了个hookso的工具,用来操作linux进程的动态链接库行为,本文从so注入热更新入手,简单讲解一下其中的原理,配合源码阅读效果更佳。...这里要介绍一下linux的ptrace函数。...,才能知道地址在哪里,比如main使用了一个头文件定义的函数int add(),最后编译成了main.outadd.so两个elf文件。...(实际上linux各种运行时库的版本也很难受) 为什么不做成机器码直接jmp就好了? 机器码里直接jmp,但是事先不知道目标地址,所以只能填空,这样又不好正常代码区分。...总结系统调用用户函数调用,如下图所示: 系统调用 4.png 用户函数调用 5.png 到了这里,我们已经完成了用户函数调用,也即完成了so的注入。

11.2K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linuxso注入热更新原理 | 直播回顾

    文件)在Linux中使用非常广泛,对于后台开发来说,服务器进程往往加载和使用了很多的SO文件,当需要更新某个SO时往往需要重启进程。...其实往一个进程注入so的方法,很简单,让进程自己调用一下dlopen即可。这个就是基本原理,剩下的事情,就是如何让他调用。 那么如何操作?这里要介绍一下linux的ptrace函数。...,才能知道地址在哪里,比如main使用了一个头文件定义的函数int add(),最后编译成了main.outadd.so两个elf文件。...(实际上linux各种运行时库的版本也很难受) 为什么不做成机器码直接jmp就好了?     机器码里直接jmp,但是事先不知道目标地址,所以只能填空,这样又不好正常代码区分。...总结系统调用用户函数调用,如下图所示: 系统调用: 用户函数调用: 到了这里,我们已经完成了用户函数调用,也即完成了so的注入。下一步就开始具体的热更新操作了。

    1.4K10

    linux 什么是SO文件

    下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...gcc -fPIC -g -c s.c -o libs.o ———————————————————————- -fPIC: -fPIC作用于编译阶段,告诉编译器产生位置无关代码(Position-Independent...———————————————————————- 链接:得到输出文件libs.so gcc -g -shared -Wl,-soname,libs.so -o libs.so libs.o -lc...这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。   ...文件:得到libb.so gcc -fPIC -g -c b.c -o libb.o gcc -g -shared -Wl,-soname,libb.so -o libb.so -lc 修改

    5.7K20

    Linux动态链接库.so文件的创建使用

    对于Linux系统,这个loader的名字是/lib/ld-linux.so.X(X是版本号)。这个loader启动后,反过来就会load所有的其他本程序要使用的共享函数库。...环境变量LD_PRELOAD列出了所有共享函数库中需要优先加载的库文件,功能和/etc/ld.so.preload类似。这些都是有/lib/ld-linux.so这个loader来实现的。....1 -o liblusterstuff.so.1.0.1 a.o b.o -lc 下面是一些需要注意的地方: 不用使用-fomit-frame-pointer这个编译参数除非你不得不这样。...)         libc.so.6 => /lib/libc.so.6 (0x40020000)         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (...foo foo.c –ldl 参考推荐: Linux动态链接库.so文件的创建使用 Linux动态库(.so)搜索路径 Linux 动态库静态库制作及使用详解

    9.2K51

    Linux O(n)调度器

    前面我们学习了调度器的设计需要关注的几个点,在这里复习下: 吞吐量(对应的是CPU消耗型进程) 响应速度(对应的是IO消耗型进程) 公平性,确保每个进程都可以有机会运行到 移动设备的功耗 Linux中调度器的设计...早期的调度算法的设计,先从最早的调度器算法开始,此调度器时间复杂度是O(n),所以也可以称为O(n)调度算法。...我们选择的内核版本是linux-2.4.19。 O(n)调度器的实现原理 O(n)代表的是寻找一个合适的进程的时间复杂度。...int processor; unsigned long cpus_runnable, cpus_allowed; } counter代表的是进程的时间片,就是进程在一个调度周期中可运行的时间...总之O(n)调度器有很多问题,不过有问题肯定要解决的。所以在Linux2.6引入了O(1)的调度器。

    3.3K20

    Linux O(1)调度器

    O(n)调度器的种种问题,linux内核社区则在2.6内核版本引入了O(1)调度器,当然了引入的目的也正是要解决O(n)调度器面临的问题。...我们这片文章以Linux2.6.2版本来学习,在Linux内核文档中有一篇关于O(1)调度器的目的,如何设计的,以及实现有一个详细的介绍:sched-design.txt文档,有兴趣的可以去阅读。...从以上几点来看,可以看出O(1)的算法的改进都是针对O(n)算法存在的问题来修改的。...总结: O(1)调度器的引入主要是为了解决O(n)调度器的不足 O(1)调度器在赏罚机制上比O(n)调度器考虑的因素比较多,不再时像O(1)那样直接考时间片的大小来调度 但是O(n)和O(1)调度算法上核心还是通过判断一个进程的行为...如果去看O(1)调度器的实现,没有O(n)算法那么简单明了,O(1)中加了需要时间的判断,各种情况的考虑,导致代码的阅读性很差,读起来很费劲。

    2.9K21

    谈谈调度 - Linux O(1)

    约莫十五年前,当我刚刚开始参加工作时,赶上 Linux 发布划时代的 2.6 内核。在这个大家都翘首期盼的内核版本中,最令人兴奋的便是 O(1) scheduler。本文来谈谈这个算法是如何实现的。...2.4 scheduler 的问题 Linux 2.4 scheduler 支持 SMP(Symmetric Multi-Processing),然而,由于只用一个 global runqueue,各个...谈到搜索,大家第一反应是 hash table 是 O(1) 时间复杂度的。然而,它在最坏情况下是 O(N) 的。除此之外,没有任何算法能在最坏情况下 search 也是 O(1)。...linked list,stack,queue 在平均和最坏情况下都是 O(1),而大家脑海里的 hash table,同样的,虽然平均是 O(1),但最坏情况是 O(N)。...在其刚问世时,很多 linux 发行版就迫不及待将其移植回 2.4 kernel。而程序君整个职业生涯中接触过的一些调度器中,都能见到 bitarray + priority queue 的身影。

    1.8K80

    《数据结构算法》O(3N)=O(N)?

    逻辑结构 描述数据逻辑关系的一种方式,数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。所有的数据结构在逻辑上都可以用这四种中的一种。 ?...抽象数据类型有自己的定义格式: ADT 抽象数据对象名 { 数据对象:(数据对象的定义) 数据关系:(数据关系的定义) 基本操作:(基本操作的定义) } 算法数据结构 算法 解决一类问题而规定的一个有限长操作序列...在学习算法效率的时候一般会把O(3N)≈O(N),N的常数倍都直接约等于O(N)。这也是约等于,不是完全相等。实际编程设计时特别是在一些效率要求较高的程序设计一定要考虑进去,不能约等于。...在高并发的请求下,O(3N)和O(N)是有着天壤之别的。 我在工作中遇到的一个实例,差点背了事故。...错误的把O(3N)=O(N)的算法上线了。把算法优化为O(N)之后,经过一番压力测试完全没问题。这次事件对我一个很大的启示是,高并发的场景下,O(3N)≠O(N),一定不能等于。

    53140

    Android Linker SO 加壳技术

    对于非安全方向开发者,深刻理解系统的装载链接机制也是进阶的必要条件。 本文详细分析了 Linker 对 SO 文件的装载和链接过程,最后对 SO 加壳的关键技术进行了简要的介绍。...SO 的装载链接 2.1 整体流程说明 1. do_dlopen 调用 dl_open 后,中间经过 dlopen_ext, 到达第一个主要函数 do_dlopen: ?...对 elf header 的验证包括: magic字节 32/64 bit 当前平台是否一致 大小端 类型:可执行文件、SO … 版本:一般为 1,表示当前版本 平台:ARM、x86、amd64 …...加壳工具: 将被保护的 SO 加密、压缩、变换,并将结果作为数据 loader 整合为 packed SO。 下面对 SO 加壳的关键技术进行简单介绍。...注意第2步复制 segment 时,目标地址需要加上 seg_page_offset,seg_page_offset 是 segment 相对页面起始地址的偏移。

    3K61

    Unity SO 交互 ☀️| .so文件(动态链接库 ) 基础知识科普

    前言 因为最近用到了so文件相关内容 所以来学习一下.so文件相关的知识,正好来写博客也当是记录并分享一些知识 最终目的是在Unity中so文件进行交互处理,但是本篇文章需要先对so文件有一个基本的认识...那肯定是先在百度、CSDN等网上平台搜一下呀,正常学习思路都是这样吧~ 所以先来看一下百度百科对于.so文件的描述 SO文件是Linux下共享库文件,即编译好的可以供其他程序使用的代码和数据。...so文件特点 so文件dll文件类似 so文件就是常说的动态链接库,都是C或者C++编译出来的 Linux下的so文件时不能直接运行的,一般来讲,.so文件称为共享库。...test_b.c test_c.c -fPIC -shared -o libtest.so 不用该标志外部程序无法连接。...动态库的链接 这里有个程序源文件test.c 动态库 libtest.so 链接生成执行文件 test: 命令: gcc test.c -L.

    1.7K40

    Linux进程调度之 - O(1)调度算法

    Linux是一个支持多任务的操作系统,而多个任务之间的切换是通过 调度器 来完成,调度器 使用不同的调度算法会有不同的效果。...Linux2.4版本使用的调度算法的时间复杂度为O(n),其主要原理是通过轮询所有可运行任务列表,然后挑选一个最合适的任务运行,所以其时间复杂度可运行任务队列的长度成正比。...而Linux2.6开始替换成名为 O(1)调度算法,顾名思义,其时间复杂度为O(1)。...虽然在后面的版本开始使用 CFS调度算法(完全公平调度算法),但了解 O(1)调度算法 对学习Linux调度器还是有很大帮助的,所以本文主要介绍 O(1)调度算法 的原理实现。...由于在 Linux 内核中,任务和进程是相同的概念,所以在本文混用了任务和进程这两个名词。

    4.8K81
    领券