挖坑:学习笔记(一)讲述如何在 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. 010.Ansible_palybook 循环语句

    Ansible循环语句 1 简介 我们在编写playbook的时候,不可避免的要执行一些重复性操作,比如指安装软件包,批量创建用户,操作某个目录下的所有文件等.正如我们所说,ansible一门简单的自 ...

  2. 070.Python聚焦爬虫数据解析

    一 聚焦爬虫数据解析 1.1 基本介绍 聚焦爬虫的编码流程 指定url 基于requests模块发起请求 获取响应对象中的数据 数据解析 进行持久化存储 如何实现数据解析 三种数据解析方式 正则表达式 ...

  3. linux中级之lvs概念

    一.lvs介绍 LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器.它是我们国家的章文嵩博士的一个开源项目.在linux内存2.6中,它已经成为内核的一部分,在此之前的 ...

  4. BUCK BOOST学习总结

    首先对于我这种电源方面的小白来说 关于电源用的最多的就是线性稳压了 开关类的如  TI 的TPS系列  我是只知道应用电路而不知道具体原理的 但是长此以往也不是个办法 于是今天就带打家详细的来讲一下 ...

  5. [算法] 数据结构 splay(伸展树)解析

    前言 splay学了已经很久了,只不过一直没有总结,鸽了好久来写一篇总结. 先介绍 splay:亦称伸展树,为二叉搜索树的一种,部分操作能在 \(O( \log n)\) 内完成,如插入.查找.删除. ...

  6. 调试备忘录-SWD协议解析

    目录--点击可快速直达 目录 写在前面 1  SWD协议简介 2  SWD物理层协议解析 2.1  SWD通信时序分析 2.2  SWD 寄存器简介 2.2.1  DP寄存器 2.2.2  AP寄存器 ...

  7. MongoDB学习笔记:MongoDB 数据库的命名、设计规范

    MongoDB学习笔记:MongoDB 数据库的命名.设计规范     第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...

  8. Echarts-2.2.7中统计出来的统计图保存为图片

    今天在做一个图形报表,有个需求是要把展现的统计图保存为图片, 图形报表用的Echarts-2.2.7, 以前有用过 Echarts,记得echarts插件是可以帮助我们把统计图保存为图片的. 只是不记 ...

  9. MindSpore应用目标

    MindSpore应用目标 以下将展示MindSpore近一年的高阶计划,会根据用户的反馈诉求,持续调整计划的优先级. 总体而言,会努力在以下几个方面不断改进. 1. 提供更多的预置模型支持. 2. ...

  10. 用NVIDIA A100 GPUs提高计算机视觉

    用NVIDIA A100 GPUs提高计算机视觉 Improving Computer Vision with NVIDIA A100 GPUs 在2020年英伟达GPU技术会议的主题演讲中,英伟达创 ...