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

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



可以看到生成的.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. c++11——auto,decltype类型推导

    c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率.     auto和decltype的类型推导都是编译器在 ...

  2. 【golang】 go语言之环境搭建+ 第一个go语言程序

    1 下载:http://www.golangtc.com/download (以win为例) 2 安装步骤: 安装包: go1.8.windows-amd64.msi 双击进行安装 创建工作目录 :D ...

  3. centos7上开启单用户模式

    author: headsen  chen date : 2018-08-02  11:23:16 1,在出现centos7的页面的时候,按 e进入到编译内核的界面 2,找到下面的这一段,将ro 该车 ...

  4. Fluent Nhibernate Mapping for Sql Views

    Views are mapped the same way tables are mapped except that you should put Readonly() in the mapping ...

  5. go练习4--json 序列号反序列化

    //定义结构体 //首字母大写 , json:"msg_id" 是 tag type Message struct { MsgId string `json:"msg_i ...

  6. 【office2010】office2010安装问题的解决方案。

    今天想在公司电脑上按上一个office2010,结果出现一个问题,导致研究了一下午才解决:现总结解决方案: 安装office 2010,提示需要安装MSXML版本6.10.1129.0组件.但是在网上 ...

  7. Linux 安装 MantisBT 详解

    https://www.cnblogs.com/qdwyg2013/p/6030157.html 在工作中,选用了MantisBT作为公司的BTS工具.MantisBT的作为一款缺陷跟踪管理系统,有以 ...

  8. MacBook Pro Retina 安装WIN7 - 对抗模糊及其它

    最近对虚拟机里的WIN7受够了,把整个虚拟机都删了,准备装双系统. 安装过程还是很简单的,网上教程一大堆,就是通过MAC OS X自带的BootCamp工具来管理整个安装过程,我是用外置光驱安装的,没 ...

  9. vue - vue

    一.vue - 介绍 vue的作者叫尤雨溪,中国人.自认为很牛逼的人物,也是我的崇拜之神. 关于他本人的认知,希望大家读一下这篇关于他的文章,或许你会对语言,技术,产生浓厚的兴趣.https://mp ...

  10. MongoDB: 原子性和事务

    在MongoDB中, 文档级别的的写操作是原子性的, 甚至是在对某个文档的操作中修改其多个内嵌的子文档, 也是原子性的. 在一个写操作同时修改多个文档的情况, 对其中单独的某个文档而言是原子的, 但是 ...