c语言的链接(静态链接和动态链接)以及a.out的简述

这篇具有很好参考价值的文章主要介绍了c语言的链接(静态链接和动态链接)以及a.out的简述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       链接过程分类两种,动态链接和静态链接。如果函数库的一份拷贝是可执行文件的物理组成部分,则为静态链接,动态链接生成的可执行文件只包含了文件名,在运行时,程序会自动寻找所需要的函数库。函数只有在运行的时候才会被解析调用,它是在main函数之前就决定好了。

        静态链接与动态链接的优缺点就很明显了。静态链接提前把需要的函数都载入到了可执行文件中,所有更加独立,速度更快。缺点就是程序更新不方便,生成的可执行文件更大。动态链接有点更多了,它可以随时更新自己的功能,而不需要重新编译,生成的文件更小。

         动态链接被发明的原因之一是为了把程序和特定的函数库版本分离,也就是标准接口固定,后续的函数库迭代不受版本的影响。


1.动态链接的优点

(1).相同条件下,可执行文件更小。因为动态链接只有在需要的时候,才把对应的函数和数据载入到进程。

(2).所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝。这句话有点拗口,简单来讲,就是共享库的函数只占据一份空间,不会再每一个需要的地方都占用一份,提高了空间利用率。

(3).动态链接允许用户在运行时选择需要执行的库函数版本。动态链接使得函数库的版本升级更为容易,新的函数版本可以随时发布,只要安装到操作系统中,旧的程序就能自动获得新版本函数库的优点而不需要重新链接。


2.动态链接的一般细节

       动态链接会关注函数所在的位置,所有不要改动原本动态函数所在的位置,比如C语言的动态库一般都在libc中。当然,我们也可以自己决定位置,需要在链接的时候说明。

       静态库被称为archive,通过ar(一种生产工具)来创建和更新。静态库约定在它们的文件名中使用.a的扩展名。

        还有一种技术,介于静态和动态之间,它是静态共享库,在生命周期内,它们的地址始终固定,可以直接绑定到操作系统中,但是由于限制颇多,需要专门的操作系统支持,这里只提及一句。

        动态链接库由链接编辑器ld创建,动态链接库的文件扩展名为.so(shared object)。

        回忆一下编译的四个阶段,预处理->编译->汇编->链接

        (1).预处理:替换掉预处理命令,生成.i的文件

        命令:gcc -E 文件名 -o 指定生成文件名

       (2).编译:生成汇编文件,生成.s的文件

        命令:gcc -S 文件名.i -o 指定生成的文件名

       (3).汇编:生成二进制文件,生成.o的文件

        命令:gcc -c 文件名 -o 指定生成的文件名

       (4).链接:生成可执行文件,Linux中生成的默认文件名叫a.out,在window中会生成.exe

        命令: gcc 文件名 -o 指定生成的文件名

     动态链接生成的文件名叫.so或者.dll(windows系统),而静态文件的扩展名是.a


3.动态编译的流程

        假设我们有如下几个文件:main.c test.h test.c

显然main.c是主函数,test.c是集成了许多函数的功能函数,让函数在运行期间调用test.c,编译过程如下:

      1.gcc test.c -shared -o test.dll

生成test.dll动态文件,也可以取名test.so

       2.gcc main.c test.dll -o test.exe

生成test.exe可执行文件。

知道这两个步骤就差不多了,需要注意的是,可以通过-L来指定文件路径。


4.a.out的段

             使用size命令,查看a.out文件,它会给出三种类型数据的大小,分别是text,data,bss

data段(数据段):存放初始化后的全局以及静态变量

text段(文本段):可执行文件的指定,比如加减乘除,调用函数等等

bss段:保存没有值的变量。

局部变量不进入a.out,它们是在运行时创建的

举个例子

char str[100];
static double a;

int b = 10;
static double pi = 3.14;

int main()
{

    int i = 3, j, *ptr;

    ptr = malloc(100*sizeof(int));
    ptr[3] = 3;
    return 0;
}

char str[100];
static double a;

放在bss中

int b = 10;
static double pi = 3.14;

放在data中

    int i = 3, j, *ptr;

在运行的时候自动创建,并没有保存在a.out中

    ptr = malloc(100*sizeof(int));
    ptr[3] = 3;

这种指令放在text中
 

补充:C语言运行时,操作系统对a.out的操作

主要是使用mmap函数,将a.out的各个段映射到进程空间之中,每个段都有不同的权限,有的是可读可执行,有的是可读可写,操作系统还会根据情况分配一些栈空间和堆空间,给临时变量或者malloc这样的函数使用,bss和data其实被映射到了一起,都叫数据段,

       文章来源地址https://www.toymoban.com/news/detail-728687.html

到了这里,关于c语言的链接(静态链接和动态链接)以及a.out的简述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux下Centos7 gcc/g++、动态库/静态库(动态/静态链接)

    gcc是对c语言代码进行编译链接,而g++是对c++代码进行编译链接,接下来我们只对gcc进行讲解,g++的使用方法跟gcc是一样的。 编译链接的四个步骤: 1:预处理 2:编译 3:汇编 4:链接 注:这些在后面都会着重讲解 我们先在Date.c 源文件里面写一些c语言代码,我们知道,c语言代码需

    2024年02月05日
    浏览(46)
  • 在程序中链接静态库 和 动态库

    mkdir shareLib mkdir staticLib 把这篇文章  生成的libcalc.so放入shareLib、libcalc.a放入staticLib 一、在程序中链接静态库  CMakeLists.txt CMakeLists.txt   (也可以写成这样)  二、在程序中链接动态库 CMakeLists.txt CMakeLists.txt   (也可以写成这样)  知识点:

    2024年01月17日
    浏览(46)
  • 【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 上一章我们讲解了 inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困

    2024年02月14日
    浏览(43)
  • CMake TcpServer项目 链接静态库/动态库

    一、链接静态库   查看项目结构 CMakeLists.txt  执行命令和结果:   二、链接动态库 查看项目结构 CMakeLists.txt 执行命令和结果:

    2024年01月22日
    浏览(43)
  • 「C/C++」C/C++静态链接库与动态链接库

    博客主页:何曾参静谧的博客 文章专栏:「C/C++」C/C++学习 静态链接库(Static Linking Library): 是在编译时将库代码与应用程序静态链接在一起的库。它们被编译为二进制文件,并在运行时作为应用程序的一部分被载入内存。这种库被称为“静态”是因为它们在编译时被链接,

    2024年02月01日
    浏览(38)
  • dedecms伪静态设置以及目录链接301跳转实现方法(伪静态)

    htaccess伪静态的规则 通过htaccess使用伪静态,则必须空间商支持Rewrite模块,该模块负责URL的重写。否则即便是设置好了,也无法使用,并且还有可能出现500错误。 下面是dedecms的伪静态设置文本(部分参考): 个性化伪静态还需要配合修改dedecms后台文件才能实现 效果为www.

    2024年02月01日
    浏览(43)
  • linux下g++链接动态库和静态库

    头文件的作用: include的作用就是复制内容到当前文件 井号开头的就是预处理指令,由预处理器处理,预处理阶段不关心代码,只处理预处理指令。 头文件主要 一是为了解决代码都写在一个文件太大了,二是把变量,结构体,函数声明这些固定的放在一起 函数只要声明了,

    2024年02月09日
    浏览(47)
  • windows下qt使用第三方库(静态链接库lib)、静态库和动态库区别、动态库的使用。

    这里主要是讲述windows下qt使用第三方库。 windows下qt使用第三方库(静态链接库lib)。 为了能够使测试更准确,首先自己用qt创建了一个已经封装好的lib库。 然后让另一个项目去链接这个lib静态库,并且去调用里面的方法。 目的: 使 untitled项目 能够使用 myllplib.lib 静态库,这

    2023年04月17日
    浏览(89)
  • Windows下C++静态链接库的生成以及使用

    这篇文章简单讨论一下Windows下如何使用VS生成和使用C++静态链接库,示例使用VS2022环境。 先创建C++项目-静态库 然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。 然后创建需要的.h和.cpp文件。 看下代码 很简单的代码,就是提供一个打印字符串的接口。编译一

    2024年02月05日
    浏览(35)
  • 【linux深入剖析】动态库的使用(续) | 动静态库的链接

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 回顾上节,我们在创建了动态库libmymath.so 我们使用指令 gcc main.c -L. -lmymath -L . (-L + 路径表示myc这个库在哪

    2024年04月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包