20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结 ++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

教材学习内容总结

静态链接过程

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

  • 命令:
gcc -Og -o 可执行目标文件名 main.c 函数名.c
//编译
./可执行目标文件名
//运行

可重定向目标文件&可执行目标文件

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

符合和符号表

任何带有static属性声明的全局变量或者函数都是模块私有的。

符号表是由汇编器构造的,使用编译器输出到汇编语言.s文件中的符号。

与静态库链接

  • 使用C标准库和数学库中函数的程序
gcc main.v /usr/lib/libm.a /usr/lib/libc.a

静态库(.a)

  • .a <- 静态库
  • 创建静态库
gcc -c 要封装的函数的名.c 
ar rcs 静态库名.a 要封装的函数的名.o
  • 使用静态库
gcc -c 主函数.c 
gcc -static -o 可执行目标文件名 主函数.o ./静态库名.a

或者

gcc -c 主函数.c 
gcc -static -o 可执行目标文件名 主函数.o -L. -静态库名简写
  • 调用顺序
    20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

动态库(.so)

调用编译器驱动程序

gcc -shared -fpic -o 动态库名.so 函数名.c

创建动态库

gcc -o 可执行目标文件名 main.c ./动态库名.so

位置无关代码

在调用编译器驱动程序时,命令中用到了 -fpic,指示编译器生成与位置无关的代码

而位置无关代码是可以加载而无需重定位的代码。可以把他们加载到内存的任何位置而无需链接器修改。

教材学习和代码运行中的问题和解决过程

  • 问题1:编译时:"-Og",学习解析多重定义的全局符号时:"-Wall"什么作用
  • 问题1解决方案:表示使用全局优化;会打开一些很有用的警告选项,建议编译时加此选项。
    链接: gcc 编译选项
  • 问题2:

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

对于第二种方式中的简写规则存在模糊不清

  • 问题2解决方案:首先我猜想是在静态库名里面按顺序随意挑选字符进行模糊匹配

我在自己的虚拟机上进行测试
20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

然后我发现书上第一种方式是可行的,但是第二种似乎是不可行的。
在观察了它们的报错后我发现在尝试按照书上写以下命令时它的报错与其他的不一样

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

所以我去查了一下/usr/bin/ld放的是什么东西

Linux中出现/usr/bin/ld: cannot find -lxxx报错该怎么办?

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

在看到小橘框标识所处的地方我开始猜想是不是静态库命名有标准,不能随意起,是否是"lib+名"?

于是我进一步进行试验
20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

经试验证实我的猜测正确,再加上后来我接着看小橘框的下一行,更加作证了我的想法。

缩写格式为"-l"+".a名字的除了lib的部分"。其实就少些了两个字母而已,2333

如果一定不想用"lib"+"名字"的方式起自己的静态库名字,用第一种方式也是可以运行出来的。

  • 问题3:20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

红色框框之处语义矛盾,到底放哪?

  • 问题3解决方案:结合图中下面那个例子,我猜人逻辑理解的“之前”在命令行表现为放到后面。

代码托管

20155325 2017-2018 1 《信息安全系统设计基础》 第十四周学习总结
++不论是在查资料还是编译运行时总能碰到这个库那个链接的问题,所以我认为有必要再回去看看第七章++

上周考试错题总结

  • Y86-64中()指令没有访存操作.

A .
rrmovl
B .
irmovq
C .
rmmovq
D .
pushq
E .
jXX
F .
ret

正确答案: A B E

4.3节

  • 有关磁盘操作,说法正确的是()

A .
对磁盘扇区的访问时间包括三个部分中,传送时间最小。

B .
磁盘以字节为单位读写数据

C .
磁盘以扇区为单位读写数据

D .
读写头总处于同一柱面

正确答案: A C D

p409

  • 有关RAM的说法,正确的是()

A .
SRAM和DRAM掉电后均无法保存里面的内容。

B .
DRAM将一个bit存在一个双稳态的存储单元中

C .
一般来说,SRAM比DRAM快

D .
SRAM常用来作高速缓存

E .
DRAM将每一个bit存储为对一个电容充电

F .
SRAM需要不断刷新

G .
DRAM被组织为二维数组而不是线性数组

正确答案: A C D E G

p400

  • 有关exec系列函数,下面说法正确的是()

A .
可以用char[][] 来传递argv

B .
进程调用了exec系列函数后,pid会变

C .
进程调用了exec系列函数后,代码会改变。

D .
system()和exec系列等价。

E .
exec系列函数中带e的要传入环境变量参数

F .
exec系列函数中带v的要传入环境变量参数

正确答案: C E

不能用char[][] 来传递argv,结尾的0(null)无法处理;system=fork+exec+wait;

结对

  • 本周结对学习情况
    • 20155328
    • 结对照片
    • 结对学习内容
      • 第十四周博客

学习进度条

时间 代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 16篇 400小时
第1周 9/9 1/1 19/19 熟练下载安装技能,锻炼解决问题能力
第2周 380/389 2/3 26/45 1、7章
第3,4周 1270/1659 3/6 42/87 2、10章
第5周 20/1679 2/8 30/117 实验一&3章
第6周 223/1902 1/9 20/137 课堂测试、课下作业、第八章
第7周 3020/4770 2/11 20/157 实验二、第四章
第8、9周 21665/26435 3/14 55/212 实验三、第六章
第10、11周 410/26845 3/17 40/252 实验四、第九章
第12、13周 2437/287021 2/19 38/290 实验五、第十二章

参考资料