so库软件 so格式文件是什么文件

编程入门 行业动态 更新时间:2024-10-28 16:16:19

这个是linux系统下的文件,你的手机应该是安卓平台,安卓平台是从linux内核的基础上发展过来的,所以会有后缀为.so(shared object)的文件,当然这样解释不够精确、详细,肯定会被吐槽,具体如下:

准确地、详细地来说,

手机里面有硬件,也就是弱电学中的电路,电路组成了CPU和协助CPU的外围电路,

CPU上面移植了Linux内核,好,接下来就开始百花齐放了:

1、有的手机跑的是安卓的系统

2、有的时候跑的是linux系统

他们都基于Linux内核,对于Linux内核有不同的扩充,有的扩充成A系统,叫安卓,有的扩充成B系统,叫Linux,但是手机上,安卓相对linux,更加流行。

而Linux内核,并不是唯一的,有正统的,也有非正统的(不太常见而已),而Linux内核对应的CPU结构,也有很多种,因此不同的智能手机可能有不同的CPU、不同的Linux内核和不同的安卓系统(这个系统里包含了Linux内核)

当然还有跑windows的,扯远了,windows的手机,里面应该可以找dll文件,这个对应安卓系统的.so文件。

还没讲so文件是干嘛的~

那为什么起个名字叫share object?

这个so文件,有时候是直接被调用的,有时候是会参与到编译中的,也就是说,一个.so文件可能会被多个应用程序用到,因此取名叫share object。

这个就和windows里面一样,如果有时候百度下载了几个调用dll文件的软件,恰好电脑里面缺这几个dll,那么此时,这几个软件将不能运行,也就是说,这几个dll会被这几个软件在运行时都用到,有share的味道,所以在windows里面叫链接库,在Linux内核的系统上(可以是ubuntu啊、redhat啊,android等等)叫.so(shared object),作用类似,windows中起名字更严肃点,linux对它的起名更形象些,意思差不多。当然区别肯定会有,这里只是回答得让读者大致理解,具体差别请另外百度。

.so文件怎么运作的?(下面两个步骤摘自百度)

###########################################

①编译阶段。链接编辑器(link editor)拿它和其他Relocatable object file以及其他shared object file作为输入,经链接处理后,生存另外的 shared object file 或者 executable file。

②运行阶段。动态链接器(dynamic linker)拿它和一个executable file以及另外一些 shared object file 来一起处理,在Linux系统里面创建一个进程映像。

###########################################

所以大家爱吐槽啊,这个C牌子的智能手机,怎么刷不了那个D牌手机 官方系统包啊?出来各种问题,有些问题是可以解决的,有些是解决不了的,甚至会有烧机的情况。

这类问题和底层的CPU种类、Linux内核种类及版本、so文件版本等都是相关的。

所以有些牌子的智能机有通吃现象,可以刷其他牌子的各种官方系统,有的智能机则不行。

总结:

CPU和PCB外围电路=>Linux内核+应用组件组成的安卓系统=>对.so文件和其他文件一起编译=>对.so文件和其他文件一起运行=>创立进程、线程(也就是手机上的各种app和系统自带功能)=>然后我们就可以使用手机上的各种功能了。

最后,以上回答只是为了让读者有初步的、粗略的、大致的理解。任何专业名词和术语只要打了比方,就肯定是不绝对精确的。更详细的,请参考专业文献。

手机里面的so文件,如果是应用软件的,删除后,应用软件请重装,如果是系统自带的,请尽量不要删除。

抛砖引玉,答得不好,请别骂,谢谢!

动态库 sl 和 so文件的区别

我们通常把一些公用函数制作成函数库,供其它程序使用。

  函数库分为静态库和动态库两种。

  静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

  动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

  本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。

  在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。

  第1步:编辑得到举例的程序--hello.h、hello.c和main.c;

  hello.h(见程序1)为该函数库的头文件。

  hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。

  main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。

  程序1: hello.h

  #ifndef HELLO_H

  #define HELLO_H

  void hello(const char *name);

  #endif //HELLO_H

  程序2: hello.c

  #include

  void hello(const char *name)

  {

  printf("Hello %s!/n", name);

  }

  程序3: main.c

  #include "hello.h"

  int main()

  {

  hello("everyone");

  return 0;

  }

  第2步:将hello.c编译成.o文件;

  无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。

  在系统提示符下键入以下命令得到hello.o文件。

  # gcc -c hello.c

  #

  (注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。)

  (注2:首字符"#"是系统提示符,不需要键入,下文相同。)

  我们运行ls命令看看是否生存了hello.o文件。

  # ls

  hello.c hello.h hello.o main.c

  #

  (注3:首字符不是"#"为系统运行结果,下文相同。)

  在ls命令结果中,我们看到了hello.o文件,本步操作完成。

  下面我们先来看看如何创建静态库,以及使用它。

  第3步:由.o文件创建静态库;

  静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。

  在系统提示符下键入以下命令将创建静态库文件libmyhello.a。

  # ar cr libmyhello.a hello.o

  #

  我们同样运行ls命令查看结果:

  # ls

  hello.c hello.h hello.o libmyhello.a main.c

  #

  ls命令结果中有libmyhello.a。

  第4步:在程序中使用静态库;

  静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

  在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  Hello everyone!

  #

  我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。

  # rm libmyhello.a

  rm: remove regular file `libmyhello.a'? y

  # ./hello

  Hello everyone!

  #

  程序照常运行,静态库中的公用函数已经连接到目标文件中了。

  我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。

  第5步:由.o文件创建动态库文件;

  动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。

  在系统提示符下键入以下命令得到动态库文件libmyhello.so。

  # gcc -shared -fPCI -o libmyhello.so hello.o

  #

  我们照样使用ls命令看看动态库文件是否生成。

  # ls

  hello.c hello.h hello.o libmyhello.so main.c

  #

  第6步:在程序中使用动态库;

  在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们先运行gcc命令生成目标文件,再运行它看看结果。

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

  #

  哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。

  # mv libmyhello.so /usr/lib

  # ./hello

  Hello everyone!

  #

  成功了。这也进一步说明了动态库在程序运行时是需要的。

  我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对问题必究到底的心情,来试试看。

  先删除 除.c和.h外的 所有文件,恢复成我们刚刚编辑完举例程序状态。

  # rm -f hello hello.o /usr/lib/libmyhello.so

  # ls

  hello.c hello.h main.c

  #

  在来创建静态库文件libmyhello.a和动态库文件libmyhello.so。

  # gcc -c hello.c

  # ar cr libmyhello.a hello.o

  # gcc -shared -fPCI -o libmyhello.so hello.o

  # ls

  hello.c hello.h hello.o libmyhello.a libmyhello.so main.c

  #

  通过上述最后一条ls命令,可以发现静态库文件libmyhello.a和动态库文件libmyhello.so都已经生成,并都在当前目录中。然后,我们运行gcc命令来使用函数库myhello生成目标文件hello,并运行程序 hello。

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

  #

  从程序hello运行的结果中很容易知道,当静态库和动态库同名时, gcc命令将优先使用动态库。

so库怎么加密,公司的一款APP,有做混淆,想对so文件做保护,请问有没有什么技术可以做这方面加密的?

额,一般应用进行个高级混淆基本都可以了,不过也有部分应用对so文件有特殊保护需求,这个一般比较高级了,很多宣称可以做的实际也做不了的,你可以去技术论坛或者网页搜一下,仔细咨询下

现在做应用保护的企业并不多,有3、5家左右,挨个咨询下,总有能满足你需求的。

安卓的so库能够反编译吗,如果可以,拿什么软件?

so文件貌似是二进制文件,编辑起来好麻烦的,一般不用动。

如果apk文件包含lib库,你还需要提取apk里面的so文件,并放到system/lib目录里面,

卓rom包 添加apk程序 先把apk里面的lib文件夹下的so格式文件提取出来放入 安卓rom包的lib问下下 在把apk添加到rom包system/

Linux软件缺少动态链接库.so怎么办

几种办法

  • 从别的相同版本的系统中把这个so文件copy到相同路径下就可以了

  • 查看这个so文件属于哪个软件包,安装这个软件包

  • 转载请注明出处51数据库 » so库软件 so格式文件是什么文件

    • 0
    • 0
    • 0
    • 0
    • 0

    更多推荐

    so库软件 so格式文件是什么文件

    本文发布于:2023-06-08 14:27:38,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/583064.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:格式文件   文件   软件

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!