C专家编程(二)

第四章,数组和指针不同


第五章,对链接的思考

1. 怎么样在函数库中观察一个符号?

  一般有些情况下,我们会在链接程序的时候遇到这样的错误提示:undefined symbol xxx

  它提示我们无法找到符号 xxx 的定义,我们可以通过搜索链接库的笨办法来找到它(笨办法,好办法是直接百度)

  编写如下的 shell 文件:

      cd /usr/lib

      foreach i (lib?*)

      echo $i

      nm $i | grep xxx | grep -v UNDEF

  如上的代码可以帮我们找到未定义符号所在链接库,这样我们在编译的时候通过 -lxxx 就可以将库链接进来。


2. 注意自己写的库函数不要和系统库函数重名。


第六章,运行时数据结构

1. 程序经过编译后生成的目标文件格式一般为ELF,其中包含三个重要段:.bss,.data,.text

  .bss:存储未初始化的全局及静态变量,实际上,存储的是所有未初始化的全局及静态变量的大小;

  .data:存储已初始化的全局及静态变量;

  .text:存储程序指令。


2. 在程序准备开始执行的时候,目标文件经过连接,之后将ELF格式的内容基本上算是直接拷贝进内存。其存储顺序和结构也与ELF文件格式类似。

  2.1 .text 段原封不动得拷贝进内存进程地址空间的映射区域的最下端;

  2.2 .data 段原封不动得拷贝进内存进程地址空间,处于.text 段的上端;

  2.3 .bss 段展开成具体的大小,从.data 区域上端割出一块空间来给其使用;

  2.4 .bss 段在内存中的上端是堆,由 malloc 函数获取;

  2.5 进程地址空间的顶端是栈,由参数传递或其他情况使用。


3. setjump 和 longjump 的使用

  这两个函数可以用于程序中的跳转,有点类似于 goto ,但是和 goto 相比又有明显的区别。

  3.1 goto 只能实现函数内的跳转,不能实现函数间的随意跳转;longjump 可以跳的很远,也就是可以在函数间进行跳转;

  3.2 longjump 只能回到 setjump 出现的地方,即回到过去;而 goto 在函数内部可以所以前后跳转;

  3.3 longjump 的返回附带返回值,可以有效进行程序控制,而 goto 却显得乏力。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值