挖坑:学习笔记(一)讲述如何在 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. 如何在我的EC2实例状态更改时获取自定义电子邮件通知

    具体详情,请参见: https://amazonaws-china.com/cn/premiumsupport/knowledge-center/ec2-email-instance-state-ch ...

  2. Ansible命令行方式执行

    Ansible ad-hoc 什么是ad-hoc? 临时命令,执行完不会保存,类似于批量执行命令. ansible的选项 -i # 指定主机清单 ansible rsync -m ping -i 1. ...

  3. k8s用 ConfigMap 管理配置(13)

    一.ConfigMap介绍 Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap ConfigMap 的创建和使用方 ...

  4. MyBatis 全局配置文件详解(七)

    MyBatis 配置文件作用 MyBatis配置文件包含影响 MyBatis 框架正常使用的功能设置和属性信息.它的作用好比手机里的设置图标,点击这个图标就可以帮助我们查看手机的属性信息和设置功能.其 ...

  5. MIPS指令的CPU实现:ALU设计

    设计CPU的第一步,设计一个简单的逻辑运算单元ALU.同时对Verilog语言也有一定要求. 一.实验内容 如图,ALU接受两个N位的输入,得到N位的输出,通过控制信号F决定运算功能. 将ALU的输出 ...

  6. python split方法

    split方法说明: split方法通过指定分隔符对字符串进行切片,如果参数num有指定值,则分隔num+1个子字符串   split()方法语法: 1 str.split(str="&qu ...

  7. 一:windows10开启虚拟化服务(也可用于部署docker提前准备)

    查看虚拟化已开启: 如果未启用,则需要添加虚拟化功能:控制面板 -> 启用或关闭Windows功能 选择Hyper-V的所有功能,确定: 系统会自动搜索并安装功能.安装完毕即可. 完结,撒花~~

  8. es 查询更新操作

    # es 查询更新操作# _*_ coding: utf-8 _*_ import time import datetime import pymysql from elasticsearch imp ...

  9. Linux 中/var/spool/postfix/maildrop目录下堆积大量小文件 如何删除

      Linux 中/var/spool/postfix/maildrop目录下堆积大量小文件 如何删除 1.先删除maildrop目录下的通知邮件文件 命令:find /var/spool/postf ...

  10. 图像分类:CVPR2020论文解读

    图像分类:CVPR2020论文解读 Towards Robust Image Classification Using Sequential Attention Models 论文链接:https:// ...