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

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

可以看到生成的.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的学习及时的反思总结很重要,一些当时想不通的事过一段时间后就想通了,一些当时想通的事过一段时间后可能也会忘了。总之还是要多多练习。

转载于:https://www.cnblogs.com/thechosenone95/p/9826085.html

2018-2019-1 20189218《Linux内核原理与分析》第二周作业相关推荐

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

    写之前回看了一遍秒速五厘米:如果?下落的速度正好 那么13年的长度刚好是地球的最远距离!直径两端 在进行实验楼操作之前,先听授了网易云课堂中孟老师关于"计算机是如何工作的?"的介绍 ...

  2. 2022-2023-1 20222809《Linux内核原理与分析》第一周作业

    Linux内核原理与分析第一周作业 配置环境 1.参考Linux(Ubuntu)系统安装图文教程中第二种借助virtualbox成功配置Ubuntu环境 2.升级更新软件包 可以通过调节分辨率和虚拟机 ...

  3. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  4. 2018-2019-1 20189213《Linux内核原理与分析》第四周作业

    <Linux内核原理与分析>第四周学习总结: 1.课本知识总结: 本章内容并不多,首先是介绍了一些Linux内核源代码的目录结构,并基于Linux内核源代码构造一个简单的操作系统MenuO ...

  5. 算法原理与分析第二次作业

    算法原理与分析第二次作业 #include<stdio.h> #include<string.h> #define MAX 100 int n=0,i=0; char *key ...

  6. 实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  7. 20169210《Linux内核原理与分析》课程总结

    每周作业链接汇总 第一周作业:对实验楼<Linux 基础入门(新版)>课程的学习,其中有用户及文件权限管理.Linux 目录结构及文件基本操作.环境变量与文件查找.文件打包与解压缩等共17 ...

  8. 2018-2019-1 20189218《Linux内核原理与分析》第九周作业

    进程调度的时机 进程调度时机就是内核调用schedule函数的时机.当内核即将返回用户空间时,内核会检查need_resched标志是否设置.如果设置,则调用schedule函数,此时是从中断(或者异 ...

  9. 《Linux内核原理与分析》第二周作业

    反汇编一个简单的C程序 1.实验要求 使用: gcc –S –o test.s test.c -m32 命令编译成汇编代码,对汇编代码进行分析总结.其中test.c的具体内容如下: int g(int ...

  10. 2018-2019-1 20189204《Linux内核原理与分析》第三周作业

    OS是如何工作的 学习任务: 阅读学习教材「庖丁解牛Linux 」第2章 学习蓝墨云班课中第三周视频「操作系统是如何工作的?」,并完成实验楼上配套实验二. 云班课学习笔记: 计算机三大法宝 程序存储计 ...

最新文章

  1. 2021年大数据Flink(七):​​​​​​​参数总结
  2. Kotlin的解析(下)
  3. tensorflow处理简单线性回归
  4. oracle12c导11g,Oracle12c的数据库如何向11g导入
  5. 软件工程启程篇章:C#和四则运算生成与运算
  6. Rails文件上传file_field报错Encoding::UndefinedConversionError
  7. 信息如何实现病毒式传播?一文看懂Gossip协议
  8. 【STM32】关于BOOT引脚和一键下载电路下载的一些事
  9. Android camera (12)---camera ap在特殊的应用场景下额外使用一套独立的camera tuning参数
  10. 二分查找算法(C#实现)
  11. 2015年辽宁省赛Interesting Tree
  12. [转载] Java的访问修饰符、非访问修饰符分类详细总结以及修饰符用途总结
  13. OpenGL多线程创建纹理,附加我的测试结果
  14. 网络信息安全常用术语
  15. 当vs2005番茄助手试用过期,并报错的解决方法
  16. 25岁女生,转行学前端合适吗?
  17. Windows Server 2003 计划任务创建说明
  18. 第一章: 准备面试要知己知彼
  19. 蒲公英分发平台无法下载App
  20. 如何编写高质量的易语言代码?

热门文章

  1. 467.环绕字符串中唯一的子字符串
  2. iNOC产品部-杨辉三角的变形
  3. 利用模板类型实现累加
  4. 面试题:100个白球,100个黑球,每次取两个
  5. 局域网计算机无法配置网关,在内网中,为什么不设置“默认网关”计算机也能互相通讯?...
  6. 安卓命令和linux命令行,scrcpy:用电脑显示和控制Android设备的命令行工具
  7. python快速编程入门课本中的名片管理器_Python-名片管理器
  8. 深度学习多种模型评估指标介绍 - 附sklearn实现
  9. shiny datatable child row:shiny表格二级子行的展开与折叠
  10. 最新基于高德地图的android进阶开发(1)获取 Map API Key