zoukankan      html  css  js  c++  java
  • 《Linux内核原理与分析》汇编与反汇编

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

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

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

  • 相关阅读:
    工作中遇到的java 内存溢出,问题排查
    java线上内存溢出问题排查步骤
    性能测试-java内存溢出问题排查
    164 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 04 终止finally执行的方法
    163 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 03 使用多重catch结构处理异常
    162 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 02 使用try-catch结构处理异常
    161 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 01 try-catch-finally简介
    160 01 Android 零基础入门 03 Java常用工具类01 Java异常 03 异常处理简介 01 异常处理分类
    159 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 02 异常分类
    158 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 01 什么是异常?
  • 原文地址:https://www.cnblogs.com/thechosenone95/p/9826085.html
Copyright © 2011-2022 走看看