`

程序的加载和链接

阅读更多

 

 

 

hello.h

 #ifndef HELLO_H
 #define HELLO_H

 void hello(const char *name);

 #endif //HELLO_H

 

hello.c

#include <stdio.h>
 
void hello(const char *name) {
    printf("Hello %s!\n", name);
}

 

main.c

#include "hello.h"
 
int main() {
    hello("everyone");
    return 0;
}

 

 

生成 .o 文件

gcc -c hello.c

 

 

 

生成静态库文件

ar cr libmyhello.a hello.o
gcc -o hello main.c -L. -lmyhello
./hello
Hello everyone!

 

 

 

 

生成动态库

gcc -shared -fPIC -o libmyshare.so hello.c
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
用strace 运行hello能看到在指定目录下找不到文件,将libmyshare.so拷贝到/usr/lib64目录下
再运行./hello就正常了

 

 

 

 

 

 

一些相关的命令

名称 含义
ar 创建静态库,插入删除列出和提取成员
ldd 列出一个可执行文件在运行时所需要的共享库
gcc 强大的编译工具
nm 列出一个目标文件的符号表中定义的符号
size 列出目标文件中section的名字和大小
objdump

所有二进制工具之母

能够显示一个目标文件中所有的信息

最大的作用是反汇编.text 片段中的二进制指令

readelf

显示一个目标文件的完整结构

包括ELF头中编码的所有信息,包含size和nm的功能

strace 跟踪调试工具
strip 删除多余的段
objcopy 将一个目标文件中的内容拷贝到另一个中

 

 

 

 

 

参考

关于Linux静态库和动态库的分析

程序的编译链接过程

程序运行流程——链接、装载及执行

 

 

分享到:
评论

相关推荐

    微信小程序加载fbx模型

    得到了fbx模型的http链接,使其加载在小程序端,都是适配小程序版本的代码 其中three_new.js是小程序版的3D加载库文件 FBXLoader_new是小程序版本的fbx模型的加载器 inflate.min.js是小程序版的压缩解压库 model...

    java程序中加载动态链接库文件

    ### Java程序中加载动态链接库文件 #### 一、引言 在开发Java应用程序时,有时需要...通过以上步骤,开发者可以在Java程序中实现对动态链接库的加载和调用,从而扩展Java的应用范围,实现对底层硬件的访问等功能。

    内存加载动态链接库(DLL)文件

    内存加载动态链接库(DLL)是Windows操作系统中的一个重要特性,它允许程序在运行时动态地加载和使用函数库。DLL不仅可以节省系统资源,还可以实现代码共享,提高软件的可维护性和扩展性。以下是对这个主题的详细...

    计算机+链接器和加载器

    链接器和加载器是计算机系统中不可或缺的组件,它们在程序的编译、链接和执行过程中扮演着重要角色。 链接器 链接器(Linker)是一种将目标代码文件(Object File)组合成可执行文件的工具。链接器的主要任务是将...

    链接器和加载器,完整扫描版

    《链接器和加载器》讲述构建程序的关键工具——链接器和加载器,内容包括链接和加载、体系结构、目标文件、存储分配、符号管理、库、重定位、加载和覆盖、共享库、动态链接和加载、动态链接的共享库,以及着眼于成熟...

    驱动程序的加载

    总的来说,驱动程序的加载和测试是保证操作系统与硬件设备协同工作的关键环节。理解驱动程序的加载机制以及如何进行有效的测试,对于优化系统性能和确保软件质量具有重要意义。在Windows CE系统中,驱动程序以用户态...

    Linux程序向Android平台移植的研究.pdf

    首先,文章指出Linux程序向Android移植时面临的主要问题包括系统目录结构一致性、程序加载和链接等问题。Linux和Android的系统目录结构不同,这可能导致程序在寻找依赖库和资源时出现问题。此外,由于链接器和加载器...

    ELF文件的加载和动态链接过程

    文章的作者通过分析HelloWorld程序的加载和链接过程,以及符号的动态解析过程,对ELF文件的加载和动态链接进行了详细说明。这涉及到Linux内核空间加载ELF文件的过程,以及在程序运行过程中符号的动态解析。这些过程...

    Linkers and Loaders(链接器和加载器 )

    《链接器和加载器》是计算机科学中关于程序编译和执行过程的重要组成部分。链接器和加载器在软件开发的生命周期中起着至关重要的作用,它们确保程序代码能够正确地组织、连接并运行。 首先,我们需要理解链接器...

    链接器和加载器(中英文两个版本)

    链接器和加载器是计算机系统中的关键组件,它们在程序的生命周期中扮演着至关重要的角色。本文将深入探讨这两个概念,以及它们如何协同工作来构建和执行可执行程序。 首先,我们来理解“链接器”(Linker)。链接器...

    静态加载动态链接库

    静态加载动态链接库是与运行时动态加载相对的一种方式,它在编译时就将DLL的功能整合到可执行文件中,使得程序在启动时无需额外查找和加载DLL。 静态加载动态链接库通常通过.lib文件实现。.LIB文件是静态链接库,它...

    链接器和加载器 beta2.pdf

    链接器和加载器是现代计算机编程不可或缺的组成部分,它们在程序的编译、链接和加载过程中扮演着重要角色。通过理解这些概念和技术,程序员能够更好地掌握程序的构建和运行机制,从而提高软件的质量和效率。

    C#动态加载程序集

    C#动态加载程序集详解 动态程序集是指没有被编译至主程序,而是主程序在运行时动态调用或者生成的程序集。...动态加载程序集是C#中的一种重要机制,可以提高程序的灵活性和扩展性,但需要注意序列化和反序列化的问题。

    《链接器和加载器》(中文版)

    - 链接时重定位发生在链接阶段,而加载时重定位则在程序加载时进行。 **符号和段重定位**: - 重定位不仅涉及符号地址的调整,还包括整个段的移动。 **符号查找**: - 在重定位过程中,链接器需要找到符号的实际...

    ELF format

    重定位表则包含了在程序加载和链接过程中需要重新定位位置的符号信息,它用于修正程序中相对地址和绝对地址之间的差异。 在ELF文件中,还定义了多种节类型,如.text节用于存储程序代码,.data节用于存储初始化的...

    程序的链接和装入

    ### 程序的链接和装入:深入理解与Linux动态链接实现 #### 链接器和装入器的基本工作原理 程序的链接和装入是计算机科学中至关重要的两个概念,它们确保了程序从编写到运行过程中的正确性和效率。在探讨这一主题时...

Global site tag (gtag.js) - Google Analytics