问题一 动态库链接找不到库问题

这个问题当时确实对我造成了很大的困扰,虽然最终仍然成功用动态库链接但是问题并没有解决。现在回过头来看却觉得有点蠢,但出错的过程仍然值得总结。首先看我的目录结构:



可以看到生成的.so文件在libslib下各有一个,至于为什么会有这么两个目录,是因为ppt中

-L. 指定库目录

让我误以为-L.指定的是一个默认的目录,至于叫lib还是libs有些分不清所以都试试。链接时我的命令中使用的都是-L.,所以提示找不到文件或目录。那么我当时是怎么解决的呢?

也就是说把-l <库名>这一部分直接写出库的完整路径,即便是-L参数写错甚至不写都没有关系!为了验证猜想我又运行了以下几条命令,通过他们成功或者不成功证明之前的猜想确实是对的。

ppt中的错误固然有一定误导性,但归根结底还是对linux中命令的写法理解不够深。其实前面做静态库链接时已经知道-L.中的.是指当前目录,这是指定当前目录为库目录,但过一段时间后又忘了。再比如PPT中头文件目录写成-Iinclude,当时固然觉得别扭,为什么和其他命令不一样,-I 之后没有空格?但还是照写,成功运行之后也没有尝试加空格行不行,直到现在写博客的时候才试了一下,结果是可以的。可见学习过程中及时的反思总结十分有必要,写博客其实也是一个反思总结的过程。

最后,附上链接动态/静态库的规范写法示例:

问题二 makefile相关问题

文件名?路径?

makefile中的书写规范是target : 依赖文件名;command,但在实际写makefile是却总是提示找不到依赖文件,因为在command中会指定依赖文件的路径,所以一开始没有怀疑是依赖文件名这一部分出了问题,后来才发现依赖文件名这一部分也要带上路径。

一个小总结,Linux下一切文件名即路径,找不到文件或目录先把完整路径写上试试。

第一个target

同样是在写makefile时,我发现第一个target的依赖文件都还没有生成,以为在编程时都是先声明,再引用,所以顿感这样十分别扭,便按照生成的顺序把各个target排好序,结果是这样写的makefile只生成了第一个target,于是猜测第一个target的依赖文件会告诉系统该生成哪些文件。在网上查阅makefile的相关信息得知

make命令通常以在Makefile文件中找到的第一个标签作为其build的目标。而对于其他标签,如果根据依赖关系,能遍历到,则该标签对应的内容就会被执行,否则不会被执行。对于这种默认不会被执行到的标签,也可以显式地让它被执行。方法就是,在make命令后面显式地加上该标签。

makefile相关还有很多知识,有时间的话尽可能好好学习一下。

问题三 什么是x86

x86,mips,amd,arm,asm,win32等等,这一串名词听过很多遍但却一直没分清具体是指什么,现在在这里简单汇总一下。

  • x86。这其实是一个指令集,指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序。intel使用的指令集有x86,EM64T,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4A,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX等;AMD主要是x86,x86-64,3D-Now!,3D-Now!+指令集。
  • mips。这是一种cup架构。处理器架构主要有ARM、X86/Atom、MIPS、PowerPC这四种,其中ARM、MIPS、PowerPC是基于精简指令集的架构;x86是基于复杂指令集的架构;Atom是基于X86指令集或X86指令集的精简版。人们常说的mips指令集其实就是用于mips架构处理器的指令集。
  • asm.asm文件是汇编语言的源程序文件。
  • win32。在活动平台中,win32指所有32bit的平台,而x86仅仅指Intel和AMD的32位平台。

问题四 安装VScode

没有选用微软官网给出的Ubuntu安装vscode的方式,其一是因为要去官网下载安装包本地安装,其二是因为deb那些东西第一眼看过去看不懂。这两项都违反了我对于Linux一条命令就能安装应用的良好印象,所以采用其他方式。

Ubuntu——Make安装VS code

  1. sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
  2. sudo apt-get update
  3. sudo apt-get install ubuntu-make
  4. umake web visual-studio-code

在实际操作中发现第四条指令无法正确执行,使用umake ide visual-studio-code即可。

具体详见在Ubuntu中安装Visual Studio Code

ppa,Ubuntu-make

ppa即Personal Package Archives,使用PPA,软件制作者可以轻松地发布软件,并且能够准确地对用户进行升级。Ubuntu用户使用PPA源将更加方便的获得软件的最新版本。

ubuntu-make是一个用于在Ubuntu中安装大型软件的便利工具,前身是Ubuntu Developer Tools Center,使用ubuntu-make可以一句话安装大型的软件。

修改时区

在安装ubuntu-make时,会因为时间设置问题产生错误,所以要修正系统时间至所在地时区时间。知道产生问题的原因后其实修改时间很简单,这里不再赘述,详见Ubuntu修改时区和更新时间

终端启动 vscode

umake安装vscode虽然方便,但是安装后无法直接在终端启动,按照之前的知识想要在终端任意地方直接启动vscode需要将可执行文件加入环境变量,但有些搞不明白的是,这样安装的vscode即便是在终端输入可执行文件的完整路径也无法在终端直接启动,只能通过图形界面启动,因此此方式安装也有瑕疵。

snap安装 VS code##

只需执行命令sudo snap install --classic vscode就可以在终端任何位置输入vscode直接执行了。

重要 反汇编c语言代码&&调试汇编代码

对main.c文件执行命令

gcc -S -o main.s main.c -m32

即可得到汇编文件,其中-m32表示生成32位的汇编代码。打开.s文件并删除其中所有.开头的行,即可得到和执行环境无关的便于人读懂的汇编代码,如下所示。

main.c文件

int g(int x)
{
return x+3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8)+1;
}

执行上述命令得到的.s文件:

删除.开头的行后剩余部分:

对于汇编代码执行中堆栈及寄存器的变化情况,理解虽然表面上不难,但却不知道自己理解的对不对,因此需要查看运行时程序确切的寄存器变化,因此将汇编代码编译成可执行文件并调试。

使用如下命令生成可调试的执行文件:

使用info registers查看运行中的寄存器变化。

运行中的堆栈变化示意图见下手写图:

总结

Linux的学习及时的反思总结很重要,一些当时想不通的事过一段时间后就想通了,一些当时想通的事过一段时间后可能也会忘了。总之还是要多多练习。

2018-2019-1 20189218《Linux内核原理与分析》第二周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  5. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. 【PHP+Redis】 php-redis 操作类 封装

    <?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...

  2. 在Linux中的.iso文件的处理方法

    1,mkdir /a 2,mount MLNX_OFED_LINUX-4.4-2.0.7.0-rhel7.3-x86_64.iso  /a3,cd /a4,这样就可以对文件进行操作了

  3. Mac - 苹果电脑mac系统释放硬盘空间方法汇总

    硬盘空间是大家最头痛的一个问题,大家在硬盘空间变小的时候怎么腾空间的呢?下面为大家分享7个mac系统释放空间的高级方法,大家赶紧来收了! mac系统释放硬盘空间方法: 方法一:删除Emacs--可以节 ...

  4. Mssql备份失败

    Mssql备份失败出现如下提示 备份时先删除默认的备份设备,自己选择路径

  5. 动态修改Python类和实例的方法(转)

    相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不满足需求的方法.比如说下面这个例子. class Dog: def bark(self): p ...

  6. 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的

    在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象.    Java程序的初始化一般遵循以下三个原则(以下 ...

  7. xutil3 post 和 get请求

    https://i.cnblogs.com/EditPosts.aspx?postid=7001253 compile 'org.xutils:xutils:3.3.36' 注册xutil3 < ...

  8. 4.windows如何导入python包

    python链接:https://www.python.org/downloads/release/python-2715/ pip链接:https://pypi.org/project/pip/#f ...

  9. Spark Shuffle调优原理和最佳实践

    对性能消耗的原理详解 在分布式系统中,数据分布在不同的节点上,每一个节点计算一部份数据,如果不对各个节点上独立的部份进行汇聚的话,我们计算不到最终的结果.我们需要利用分布式来发挥Spark本身并行计算 ...

  10. Exception in thread "main" java.lang.NoClassDefFoundError: scala/Product$class

    在使用spark sql时一直运行报这个错误,最后仔细排查竟然是引入了两个scala library .去除其中一个scala的编译器即可 Exception in thread "main ...