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

为什么函数存在于.o文件中,而不存在于.so文件中?

函数存在于.o文件中,而不存在于.so文件中的原因是因为.o文件是目标文件,包含了编译器编译源代码生成的机器代码和符号表等信息,但没有进行链接的过程。而.so文件是共享对象文件,是经过链接器将目标文件和其他依赖的库文件链接生成的可执行文件。

函数存在于.o文件中的好处是可以在编译阶段进行优化和调试,可以单独编译和链接不同的目标文件,方便代码的管理和维护。同时,目标文件可以被多个.so文件共享使用,提高了代码的复用性和可扩展性。

而.so文件中没有包含函数的具体实现,只包含了函数的符号表信息,这是因为.so文件是动态链接库,它在程序运行时被加载到内存中,并与其他模块进行链接。函数的具体实现在.so文件被加载到内存后,通过符号表进行动态链接,实现函数的调用。

总结起来,函数存在于.o文件中是为了方便编译和链接的过程,而不存在于.so文件中是因为.so文件是动态链接库,函数的具体实现在运行时通过符号表进行动态链接。

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

相关·内容

【一站式解惑】Linux.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

(2) 一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就链接到应用程序的,dll文件是运行时才会被调用的。...(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件(实际上也算是一个静态库,只是在链接时只能把函数在DLL的入口链接到exe,不像真正静态链接库那样将函数体真正链接到exe ,通过lib...ar rcs my_lib.a f1.o f2.o 是把目标代码f1.o和f2.o加入到my_lib.a这个函数文件(如果my_lib.a不存在则创建) (4)使用: 用gcc生成可执行代码时,使用...,在开发环境左侧的工程文件列表中点开debug项里的PXXX.o可以看到so文件里的函数名都是在你设定的函数名后面加了一个__Fi标记,比如你用的设定的函数名称是Func(), so里的函数名则为Func...快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误终止程序运行。

4.2K52

【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( jni main 函数声明 | 命令行处理 | jni 调用 lib7zr.so 函数库处理压缩文件完整代码 )

】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程 | 配置 CMakeLists.txt 构建脚本 ) 【Android 安装包优化】...使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 ) 一、JNI main 函数声明 ---- 使用 7zr 可执行程序处理压缩文件时时 , 调用的是其主函数...压缩命令 , 或 7z x [输入文件] -o[输出目录] 解压命令 , 都是使用该主函数接收相关参数 ; int MY_CDECL main ( #ifndef _WIN32 int numArgs..., 该头文件 声明了主要的 类型 和 函数 ; 引入该头文件 ; #include 声明外部函数 : // 表示该函数在其它代码实现 // 这是 CPP\7zip\UI\Console...} else { Log.i(TAG, "内置存储空间不存在 7zr 可执行文件 , 开始拷贝文件") } // 如果不存

68020

hello程序是如何被编译出来的?

预处理 预处理主要是处理源代码以#开头的指令(#pragma 除外),例如本文hello world程序的#include,预处理之后会将stdio.h的内容插入到预处理指令的位置。...我们的hello程序调用了printf函数,但是并不存在于helloWorld.o,而是存在于libc.so或libc.a,因此我们需要通过链接将它们融合在一起。...gcc -o helloWorld helloWorld.c 执行上面的命令之后,就得到了我们的helloWorld程序了,在linux下,它是一种ELF格式的文件,后面的文章我们会更多地介绍到。...) 有兴趣的也可以尝试一下,如果删除系统的libc.so库(记得事先备份),发现能够编译过,却在最后链接失败。...正是由于整个编译过程分阶段进行,我们可以看到不同类型的问题在不同阶段出现并且有先后顺序。正因如此,链接问题在编译的最后阶段才会出现。

72620

实战遇到的C++流文件重置的一个大陷阱 为什么ifstream的seekg函数无效

Command + I 标题:Ctrl/Command + Shift + H 无序列表:Ctrl/Command + Shift + U 有序列表:Ctrl/Command + Shift + O...如何改变文本的样式 强调文本 强调文本 加粗文本 加粗文本 标记文本 删除文本 引用文本 H2O is是液体。 210 运算结果是 1024. 插入链接与图片 链接: link....mermaid section 现有任务 已完成 :done, des1, 2014-01-06,2014-01-08 进行...当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。...导入 如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入, 继续你的创作。

41930

error adding symbols: DSO missing from command line

例如: bashCopy code gcc -o myprog myprog.o -L/path/to/libs -lmylib 这将告诉编译器在指定的路径搜索所需的共享对象库。 2....例如: bashCopy code gcc -o myprog myprog.o -lmylib 3. 检查库文件是否存在 错误消息中提到的共享对象库可能不存在于系统。...请确保你在链接时使用的是正确的库名称,并确保库文件实际存在于所指定的路径。如果库文件被移动或删除,你需要重新安装或更新所需的库。 4....实际应用示例 假设我们有一个简单的C程序,包含一个源文件 main.c 和一个共享库文件 libmath.so,我们要将 libmath.so 链接到 main.c 来执行一些数学计算。...假设我们使用 GCC 编译器,可以使用以下命令: bashCopy code gcc -shared -o libmath.so math.c 接下来,我们需要编译 main.c 并将 libmath.so

1.5K10

Linux之gcc的使用

从预处理到编译一直都是在翻译我写的代码,也就是说在链接之前,我的test.c文件只有printf等C标准库函数的调用,没有对应的实现。...注意:我们所包含的头文件并没有函数的实现,只有函数的声明 感性的认识动/静态链接 动态链接 假设你是一个很爱上网的少年,但是你家没有电脑,不过你知道在你家周围有个网吧叫精英网络,你每次有上网的需要时就要从家里走路到网吧然后让网管给你开一个机子...动态库并不存在于我的程序,但是我知道这个动态库的地址,每当我有使用动态库的需求时就能根据这个地址去找到这个动态库。 静态链接 你觉得每次都要出去上网太不安全了,所以你就和你的家长商量买一台电脑。...所谓静态链接就是每次我需要使用库函数时,直接从库拷贝一份。...静态链接的优势在于: 不受库的影响,可移植性比较好,没有与库链接的过程,节省时间 缺点: 如果多个文件都用了同一个库函数,就要拷贝多次,代码冗余量高 因为有大量的拷贝内容,所以静态链接形成的可执行程序比较大

3K00

MySQL索引底层实现原理(B树和B+树)

也就是说,运行起来的进程要访问索引,需要花费磁盘I/O,先把数据、索引读到内存磁盘I/O很影响效率。...按页面分配以后,但是我们的应用程序只需要4个字节,还剩下的字节就被C函数库libc.so或者 libc++.so库的ptmalloc(缓存),tcmalloc来管理,相当于2个函数,负责管理剩下的空闲的字节...这样每一次搜索,最多只从根节点沿着某个路径加载到叶子节点上,不可能是整个索引文件都加载到内存 在B树和AVL树上搜索一个数据都是O(log2N),为什么还要使用B树?...由于数据全部存在于叶子节点,所以无论查找哪个数据,花费的磁盘I/O次数都是一样的,查找数据耗费的时间比较稳定 叶子节点被串在链表,形成了一个有序链表。...甚至还可以解释一下为什么使用B+树不使用B树。

99620

c和fortran混编

这里还牵扯到一个问题,那就是c是很纯朴的语言,c的函数在文本文件是什么名字,那么编译出来在目标文件(一般是.o文件相应的那个函数还是那个名字(不会像c++一样为了重载在函数名前后加一大堆区分符)。...T表示该符号存在于这个目标文件对应的文本文件,说白了就是有定义的符号。...就像c++要用c库,也需要在声明这个库函数时使用extern “C”,使c++编译器在编译这个函数时生成的符号名是C风格不是C++风格。...这也就是为什么时常有人问gcc main.cc会出错的问题了,如果main.cc用到了c++库函数,那么当然要使用gcc -lstdc++ main.cc才行了) 如果我们保持main.c不变,...这是编译器(f77)的一个命名规则,没有为什么,它就是把你在fortran函数名字全转换成小写,然后在最后加一个下划线。我昨天搜了很多版本,头昏脑胀,怎么调都说找不到,也没有想到要自己看看。

1.5K41

Python 相关文件常见的后缀名详解

上述过程翻译后的字节码是保存在内存,程序运行结束就没了,代码没有修改的情况下,每次生成的字节码是一样的,所以每次跑程序都再走一遍翻译字节码的过程有点浪费性能。...图片 关于pyi文件的定义规则以及自己如何生成,详见官方文档:PEP 484 – Type Hints pyw 一种 Python 源代码文件,一般只存在于 Windows 系统。...pyd Python 可直接调用的 C 语言动态链接库文件,一般只存在于 Windows 系统。...pyo 另一种 Python 字节码缓存文件,只存在于 Python2 及 Python3.5 之前的版本。 pyi Python 的存根文件,常用于 IDE 代码格式检查时的类型提示。...pyw 另一种 Python 源代码文件,一般只存在于 Windows 系统。 pyd 一种 Python 可直接调用的 C 语言动态链接库文件,一般只存在于 Windows 系统。

3.4K20

Android对so体积优化的探索与实践

注:为什么 AGP 要先编译出带调试信息和符号表的 so不直接编译出最终的 so 呢(通过添加-s参数是可以做到直接编译出没有调试信息和符号表的 so 的)?...这两种方式结合就能控制源码每个符号的可见性。 需要注意的是上面这两种方式,只能控制变量或函数是否存在于动态符号表(即是否删除其动态符号表项),不会删除其实现体。...static 关键字相当于是增强的 hidden(因为 static 声明的函数或变量编译时只对当前文件可见, hidden 声明的函数或变量只是在动态符号表不存在,在编译期间对其他文件还是可见的)...同样,也是只能删除符号表项,实现体仍然会存在于产生的 so 文件。...简要介绍一下目标文件,目标文件(扩展名 .o )也是 ELF 文件,所以也是由 section 组成的,只不过它只包含了相应源文件的内容:函数会放到 .text 样式的 section ,一些可读写变量会放到

2.4K31

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

o: 编译的目标文件 a: 静态库,其实就是把若干o文件打了个包 so: 动态链接库(共享库) lo: 使用libtool编译出的目标文件,其实就是在o文件添加了一些信息 la: 使用libtool编译出的库文件...则libtool此时根本找不到liba.la文件不存在该文件)。...ELF文件看到),上面的命令行,并没有出现libb.so,于是,可能会出现问题。...‘-rpath’跟’-rpath_link’的不同之处在于,由’-rpath’指定的路径被包含在可执行文件,并在运行时使用, ’-rpath-link’选项仅仅在连接时起作用. 3....从以上可以看出,在使用本地工具链进行本地编译情况下,只要库存在于某个位置,gcc总能通过如上策略找到需要的共享库。

8.6K30

【Java】已解决Java的java.lang.UnsatisfiedLinkError异常

二、可能出错的原因 本地库文件不存在:Java试图加载的本地库文件在指定路径下不存在。 路径问题:即使本地库文件存在,但路径没有正确设置,导致JVM无法找到它。...// 声明native方法 public native void nativeMethod(); // 其他代码... } 如果libnative.so不存在或路径不正确...确保本地库文件存在:首先,确保libnative.so(或其他平台对应的库文件)确实存在于你的项目中。...库路径 // 注意:在Windows,可能需要省略前缀"lib"和后缀".so"(或.dll) String os = System.getProperty(...lib.nativeMethod(); // 现在应该不会抛出UnsatisfiedLinkError了 } } 五、注意事项 路径问题:始终确保你提供的路径是正确的,并且库文件确实存在于该路径下

37710

从程序员角度看ELF

see 启动过程::共享库的初始化)   dlopen 一个 .so 共享库后,_init 函数在返回前会被调用,.so 共享库   是没有 _start 的!   ...test.o、crtn.o的.init section的代码共同组成了_init()函数,crti.o结尾代码会call 下一条指令,也就是说跳转到test.o的.init section的代码继续执行...的*.o)的.init代码执行之后才开始构造的,为什么放在最后,不把对 __do_global_ctors_aux()的调用放在crtbegin.o呢?...crtbegin.o的.fini代码含有对__do_global_dtors_aux()的调用,这说明C++析构函数是在后面所有.o文件(如 test.o、libc.a的*.o、crtend.o、crtn.o...如果要查找的   库名称存在于其中,则采用文件相应的路径。

95440

Redis使用及源码剖析-6.Redis整数集合-2021-1-20

but do know the insert position. */ // 因为底层数组是有序的,如果 value 比数组中最后一个值都要大 // 那么 value 肯定不存在于集合...is->length); return 0; // 因为底层数组是有序的,如果 value 比数组中最前一个值都要小 // 那么 value 肯定不存在于集合...= 0; return is; } // 运行到这里,表示 value 不存在于集合 // 程序需要将 value 添加到整数集合...* * *success 的值指示删除是否成功: * - 因值不存造成删除失败时该值为 0 。 * - 删除成功时该值为 1 。...// 默认设置标识值为删除失败 if (success) *success = 0; // 当 value 的编码大小小于或等于集合的当前编码方式(说明 value 有可能存在于集合

29920

libpython3.7m.so.1.0: cannot open shared object file: No such file or directory

这个错误信息说明在运行Python程序时,系统无法找到名为 libpython3.7m.so.1.0 的共享对象文件,或者这个文件不存在。...检查共享库文件路径确认 libpython3.7m.so.1.0 文件是否存在于正确的路径。根据你的系统和Python安装方式,共享库文件的位置可能会有所不同。...如果文件不存在,那么可能是因为Python安装不完整或被错误地删除。...添加共享库路径如果你确定 libpython3.7m.so.1.0 文件存在于正确的路径下,但系统仍然无法找到它,那么可能是因为共享库路径没有正确配置。...这需要包括 和 这两个头文件。 在 main() 函数,我们首先初始化Python解释器(Py_Initialize())。

87110

高级语言的编译:链接及装载过程介绍

他们的区别如下: 非 static 全局变量表示这个变量存在于程序执行的整个生命周期,同时可以被本源码文件之外的其他文件访问到。...static 全局变量表示这个变量存在于程序执行的整个生命周期,但是只能被本源码文件函数访问到。...非 static 局部变量表示,这个变量只在本变量所在的函数的执行上下文中存在(实际上这种变量是在函数执行栈的函数栈帧) static 局部变量其实属于全部变量的范畴,它存在于程序执行的整个生命周期,...但是我们上面提过,局部静态变量属于全局变量的范畴,它是存在于程序运行的整个生命周期的,所以为了支持这个功能,编译器对这种局部的静态变量名字加了一个后缀以便标识不同的局部静态变量。...当时是在目标文件,同样也是没有地址,我们说这是编译器留给链接器到后面的目标文件寻找变量定义的。但是现在我们检查的是可执行文件为什么可执行文件里面仍然有这种没有地址的 symbols 呢?

1.4K80

Go语言开发插件保姆级教程(2023版)

在Go,变量的类型在编译时是已知的,不是在运行时动态推断的。 PHP 语言是一种解释型脚本语言。 解释型语言是在运行时逐行解释源代码,不需要预先编译成机器码。...go build -buildmode=plugin -o my_plugin.so my_plugin.go 主程序加载插件: 创建一个主程序,通过动态链接库加载插件。...go build -buildmode=plugin -o my_plugin.so my_plugin.go 主程序加载插件: 创建一个主程序,通过插件机制加载插件。...插件加载失败处理: 在主程序要处理插件加载失败的情况,例如使用 panic 或者适当的错误处理机制。插件加载失败可能是因为文件不存在、格式错误或者版本不一致等原因。...一旦加载了插件,它将一直存在于程序运行期间。如果需要支持插件卸载,可能需要考虑其他解决方案,比如使用外部进程来运行插件,并通过进程间通信来实现。

66310

Raven2靶机-PHPMailer命令执行、udf提权复现

以后的版本存在于‘mysql/lib/plugin’目录下,文件后缀为‘.dll’,常用c语言编写 UDF提权原理 用户可以自定义提权的函数(比如执行系统命令)来进行提权。...系统命令sendmail进行邮件发送,通过传入的SERVER_NAME获取主机名(即请求host值),SERVER_NAME没有经过任何过滤,从而产生漏洞,exim4替代了sendmail的功能,即可以利用....c gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.o -lc 11.上传1518.so文件到靶机(可以创建webshell用蚁剑连接上传) 12...(0.01 sec) 查询刚才添加的数据,并并保存到/usr/lib/mysql/plugin/1518.so文件(mysql存放自定义函数的地方) mysql> select * from foo...into dumpfile '/usr/lib/mysql/plugin/1518.so'; Query OK, 1 row affected (0.00 sec) 加载1518.so函数文件用来创建自定义函数

83620
领券