挖坑:学习笔记(一)讲述如何在 Windows Vmware 上安装 Ubuntu 20.04

实践环境

本文是基于Ubuntu 20.04平台进行实验,下文中的解决方法都基于此前提

问题记录

问题一

《汇编语言程序设计》第四章的实例程序cpuid2.s在编译运行的过程中,有如下问题:

$ as -o cpuid2.o cpuid2.s
puid2.s: Assembler messages:
cpuid2.s:17: Error: invalid instruction suffix for `push'
cpuid2.s:18: Error: invalid instruction suffix for `push'
cpuid2.s:21: Error: invalid instruction suffix for `push'

该问题是由于我们当前的处理器一般都是 x86_64 或 IA64,即 64 位处理器,而书中的实例代码是在 32 位 Intel 处理器上面运行的。问题的解决方法是给as命令传入一个选项表明我们要编译 32 位的指令集,即

$ as --32 -o cpuid2.o cpuid2.s

问题二

$ ld -dynamic-linker /lib/ld-linux.so.2 -o cpuid2 cpuid2.o -lc
ld: i386 architecture of input file `cpuid2.o' is incompatible with i386:x86-64 output

该问题的原因是我们编译出的目标文件cpuid2.o是 32 为指令集,而动态链接器/lib/ld-linux.so.2和 C 库却是 64 位指令集。该问题的解决方案是我们需要安装 32 位 C 库和动态链接器,然后使用它们编译生成可执行文件。即

$ sudo apt-get install lib32z1
$ ld -m elf_i386 -dynamic-linker /lib32/ld-linux.so.2 -o cpuid2 cpuid2.o /lib32/libc.so.6
$ ./cpuid2
The processor Vendor ID is 'GenuineIntel'

问题三

当使用gcc直接编译时,把_start改成main之后,

$ gcc -o cpuid2 cpuid2.s
puid2.s: Assembler messages:
cpuid2.s:17: Error: invalid instruction suffix for `push'
cpuid2.s:18: Error: invalid instruction suffix for `push'
cpuid2.s:21: Error: invalid instruction suffix for `push'

和前面两个问题一样,该问题是因为我们默认编译 64 位指令集代码,我们需要指定gcc选项让它编译 32 位指令集代码,即使用-m32选项,但是第一次的话,这里还是存在问题

$ gcc -m32 -o cpuid2 cpuid2.s
/usr/bin/ld: cannot find Scrt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/bin/ld: cannot find libgcc_s.so.1
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status

这个问题的原因是我们没有安装 GCC 32 位相关的 C 运行时库等,解决方法为

$ sudo apt-get install gcc-multilib
$ gcc -m32 -o cpuid2 cpuid2.s
$ ./cpuid2
The processor Vendor ID is 'GenuineIntel'

结语

因水平有限,文中对问题根因的理解和对解决方案的描述可能存在错误或不准确。仅供大家参考,也欢迎大家批评指正。

参考

因为参考的文章较多,这里不一一列出。感谢分享的人们。

《汇编语言程序设计》(Professional Assembly Language)学习笔记(二)的更多相关文章

  1. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  2. 转)delphi chrome cef3 控件学习笔记 (二)

    (转)delphi chrome cef3 控件学习笔记 (二) https://blog.csdn.net/risesoft2012/article/details/51260832 原创 2016 ...

  3. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  4. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  5. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  6. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  7. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  8. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  9. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

随机推荐

  1. Java 自定义常量

    Java 中的常量就是初始化或赋值后不能再修改,而变量则可以重新赋值. 我们可以使用Java 关键字 final 定义一个常量,如下 final double PI = 3.14; 注意:为了区别 J ...

  2. 进程-信号相关 函数-(转自wblyuyang)

    Linux 中的进程: 程序时一个预定义的指令序列,用来完成一个特定的任务. C 编译器可以把每个源文件翻译成一个目标文件,链接器将所有的目标文件与一些必要的库链接在一起,产生一个可执行文件.当程序被 ...

  3. USB NCM介绍

    ​1 功能概述 USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Device ...

  4. 修改mysql中数据库存储主路径

    一.首先把mysql的服务先停掉. 二.更改MySQL配置文件My.ini中的数据库存储主路径 打开文件夹C:\ProgramData\MySQL\MySQL Server 5.7中的my.ini文件 ...

  5. [leetcode] 116. 填充同一层的兄弟节点

    116. 填充同一层的兄弟节点 其实就是个二叉树的层次遍历 class Solution { public void connect(TreeLinkNode root) { if (root == ...

  6. MindSpore张量mindspore::tensor

    MindSpore张量mindspore::tensor MSTensor #include <ms_tensor.h> MSTensor定义了MindSpore Lite中的张量. 构造 ...

  7. SpringBoot基础系列之自定义配置源使用姿势实例演示

    [SpringBoot基础系列]自定义配置源的使用姿势介绍 前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如 ...

  8. 在Visual Studio 中使用git——标记(Tag)管理(十)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  9. 1738. 找出第 K 大的异或坐标值

    2021-05-19 LeetCode每日一题 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/ 标 ...

  10. 循序渐进BootstrapVue,开发公司门户网站(3)--- 结合邮件发送,收集用户反馈信息

    在我们公司门户网站里面,如果有需要,我们可以提供一个页面给用户反馈信息,以便获得宝贵的用户信息反馈或者一些产品咨询的记录,一般这个结合邮件发送到负责人的邮箱即可.本篇随笔结合后端发送邮件的操作,把相关 ...