linux编程──gcc和clang
实验链接
编译原理实验-GCC/Clang工具链在ARM架构上的使用
实验报告
第1关:理解程序的不同表示形式
##问题1-1:
如果在命令行下执行
gcc -DNEG -E sample.c -o sample.i
生成的sample.i 与之前的有何区别?
根据定义NEG,而选择了M定义为-4
##问题1-2
请对比sample-32.s和sample.s,找出它们的区别,并上网检索给出产生这些区别的原因。如:
- pushq和pushl
- rsp和esp
sample-32.s和sample.s的区别
diff sample-32.s sample.s
1,4c1,6
< .file "sample.c"
< .text
< .globl main
< .type main, @function
---
> .arch armv8-a
> .file "sample.c"
> .text
> .align 2
> .global main
> .type main, %function
6,18c8,17
< .LFB0:
< .cfi_startproc
< pushl %ebp
< .cfi_def_cfa_offset 8
< .cfi_offset 5, -8
< movl %esp, %ebp
< .cfi_def_cfa_register 5
< subl $16, %esp
< movl $4, -4(%ebp)
< cmpl $0, -4(%ebp)
< je .L2
< addl $4, -4(%ebp)
< jmp .L3
---
> sub sp, sp, #16
> mov w0, -4
> str w0, [sp, 12]
> ldr w0, [sp, 12]
> cmp w0, 0
> beq .L2
> ldr w0, [sp, 12]
> add w0, w0, 4
> str w0, [sp, 12]
> b .L3
20c19,21
< sall $2, -4(%ebp)
---
> ldr w0, [sp, 12]
> lsl w0, w0, 2
> str w0, [sp, 12]
22,31c23,28
< movl $0, %eax
< leave
< .cfi_restore 5
< .cfi_def_cfa 4, 4
< ret
< .cfi_endproc
< .LFE0:
< .size main, .-main
< .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609"
< .section .note.GNU-stack,"",@progbits
---
> mov w0, 0
> add sp, sp, 16
> ret
> .size main, .-main
> .ident "GCC: (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609"
> .section .note.GNU-stack,"",@progbits
问题1-3 你可以用clang替换gcc,重复上面的各步,比较使用clang和gcc分别输出的结果有何异同。
gcc sample.c -o sample -v
clang sample.c -o sample -v
diff gcc.txt clang.txt
1,5c1,2
< Using built-in specs.
< COLLECT_GCC=gcc
< COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/5/lto-wrapper
< Target: aarch64-linux-gnu
< Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-arm64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-arm64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-arm64 --with-arch-directory=aarch64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
---
> clang version 10.0.1
> Target: aarch64-unknown-linux-gnu
7,14c4,14
< gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12)
< COLLECT_GCC_OPTIONS='-o' 'sample' '-v' '-mlittle-endian' '-mabi=lp64'
< /usr/lib/gcc/aarch64-linux-gnu/5/cc1 -quiet -v -imultiarch aarch64-linux-gnu sample.c -quiet -dumpbase sample.c -mlittle-endian -mabi=lp64 -auxbase sample -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/cc1Kcmw6.s
< GNU C11 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12) version 5.4.0 20160609 (aarch64-linux-gnu)
< compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
< GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
< ignoring nonexistent directory "/usr/local/include/aarch64-linux-gnu"
< ignoring nonexistent directory "/usr/lib/gcc/aarch64-linux-gnu/5/../../../../aarch64-linux-gnu/include"
---
> InstalledDir: /opt/llvm10/llvm-install/bin
> Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/5
> Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/5.4.0
> Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/6
> Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/6.0.0
> Selected GCC installation: /usr/lib/gcc/aarch64-linux-gnu/5.4.0
> Candidate multilib: .;@m64
> Selected multilib: .;@m64
> "/opt/llvm10/llvm-install/bin/clang-10" -cc1 -triple aarch64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name sample.c -mrelocation-model static -mthread-model posix -mframe-pointer=non-leaf -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -target-cpu generic -target-feature +neon -target-abi aapcs -fallow-half-arguments-and-returns -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -v -resource-dir /opt/llvm10/llvm-install/lib/clang/10.0.1 -internal-isystem /usr/local/include -internal-isystem /opt/llvm10/llvm-install/lib/clang/10.0.1/include -internal-externc-isystem /usr/include/aarch64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir /data/workspace/myshixun -ferror-limit 19 -fmessage-length 0 -fno-signed-char -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -faddrsig -o /tmp/sample-ee930b.o -x c sample.c
> clang -cc1 version 10.0.1 based upon LLVM 10.0.1 default target aarch64-unknown-linux-gnu
> ignoring nonexistent directory "/include"
17d16
< /usr/lib/gcc/aarch64-linux-gnu/5/include
19c18
< /usr/lib/gcc/aarch64-linux-gnu/5/include-fixed
---
> /opt/llvm10/llvm-install/lib/clang/10.0.1/include
23,33c22
< GNU C11 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12) version 5.4.0 20160609 (aarch64-linux-gnu)
< compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
< GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
< Compiler executable checksum: 0aba823f581e395c09d29a3a6f3b731f
< COLLECT_GCC_OPTIONS='-o' 'sample' '-v' '-mlittle-endian' '-mabi=lp64'
< as -v -EL -mabi=lp64 -o /tmp/cc281Jv1.o /tmp/cc1Kcmw6.s
< GNU assembler version 2.26.1 (aarch64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.26.1
< COMPILER_PATH=/usr/lib/gcc/aarch64-linux-gnu/5/:/usr/lib/gcc/aarch64-linux-gnu/5/:/usr/lib/gcc/aarch64-linux-gnu/:/usr/lib/gcc/aarch64-linux-gnu/5/:/usr/lib/gcc/aarch64-linux-gnu/
< LIBRARY_PATH=/usr/lib/gcc/aarch64-linux-gnu/5/:/usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu/:/usr/lib/gcc/aarch64-linux-gnu/5/../../../../lib/:/lib/aarch64-linux-gnu/:/lib/../lib/:/usr/lib/aarch64-linux-gnu/:/usr/lib/../lib/:/opt/llvm10/antlr4-cpp/dist/:/opt/llvm10/antlr4-cpp/dist/:./:/usr/lib/gcc/aarch64-linux-gnu/5/../../../:/lib/:/usr/lib/
< COLLECT_GCC_OPTIONS='-o' 'sample' '-v' '-mlittle-endian' '-mabi=lp64'
< /usr/lib/gcc/aarch64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/aarch64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/aarch64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjhDePW.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux-aarch64.so.1 -X -EL -maarch64linux --fix-cortex-a53-843419 -z relro -o sample /usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu/crt1.o /usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu/crti.o /usr/lib/gcc/aarch64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/aarch64-linux-gnu/5 -L/usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu -L/usr/lib/gcc/aarch64-linux-gnu/5/../../../../lib -L/lib/aarch64-linux-gnu -L/lib/../lib -L/usr/lib/aarch64-linux-gnu -L/usr/lib/../lib -L/opt/llvm10/antlr4-cpp/dist -L/opt/llvm10/antlr4-cpp/dist -L. -L/usr/lib/gcc/aarch64-linux-gnu/5/../../.. /tmp/cc281Jv1.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/aarch64-linux-gnu/5/crtend.o /usr/lib/gcc/aarch64-linux-gnu/5/../../../aarch64-linux-gnu/crtn.o
---
> "/usr/bin/ld" -EL -z relro --hash-style=gnu --eh-frame-hdr -m aarch64linux -dynamic-linker /lib/ld-linux-aarch64.so.1 -o sample /usr/lib/gcc/aarch64-linux-gnu/5.4.0/../../../aarch64-linux-gnu/crt1.o /usr/lib/gcc/aarch64-linux-gnu/5.4.0/../../../aarch64-linux-gnu/crti.o /usr/lib/gcc/aarch64-linux-gnu/5.4.0/crtbegin.o -L/usr/lib/gcc/aarch64-linux-gnu/5.4.0 -L/usr/lib/gcc/aarch64-linux-gnu/5.4.0/../../../aarch64-linux-gnu -L/lib/aarch64-linux-gnu -L/usr/lib/aarch64-linux-gnu -L/usr/lib/gcc/aarch64-linux-gnu/5.4.0/../../.. -L/opt/llvm10/llvm-install/bin/../lib -L/lib -L/usr/lib -L/opt/llvm10/antlr4-cpp/dist -L/opt/llvm10/antlr4-cpp/dist -L. /tmp/sample-ee930b.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/aarch64-linux-gnu/5.4.0/crtend.o /usr/lib/gcc/aarch64-linux-gnu/5.4.0/../../../aarch64-linux-gnu/crtn.o
第2关:理解使用库的C程序的编译和链接
问题2-1:
-nostdinc选项的用处是什么?
请列出 EduCoder 平台上 gcc C程序默认的头文件查找路径
如何在使用了-nostdinc选项的同时使得上述命令编译通过? 请进一步说明通过的原因(不能修改源文件)。
命令选项 -nostdinc 不搜索默认路径头文件
-nostdinc: 不要在标准系统目录中寻找文件,只是搜索‘-I’选项指定的目录
root@evassh-17600448:/data/workspace/myshixun/lab2# gcc -E sample-io.c -o sample-io.i
root@evassh-17600448:/data/workspace/myshixun/lab2# gcc sample-io.i -o sample-io
root@evassh-17600448:/data/workspace/myshixun/lab2# ./sample-io
Hello, world!
a=8
第3关:C 程序的编写和编译以及各种程序表示的对比
在文件HW/H3/c/sort.c中编写一个排序程序
#include<stdio.h>
#define N 1001
void selectSort(int a[], int n);
int main(){int n;scanf("%d", &n);int a[N];for(int i=0;i<n;i++){scanf("%d", &a[i]);}selectSort(a, n);for(int i=0;i<n;i++){printf("%d ", a[i]);}printf("\n");return 0;
}
// 排序函数
void selectSort(int a[], int n)
{for(int i=0;i<n;i++){int k=i;for(int j=i+1;j<n;j++){if(a[j]<a[k]){k=j;}}if(k!=i){int t=a[k];a[k]=a[i];a[i]=t;}}
}
在文件HW/H3/c/Makefile中编写编译规则
exe=sort
$(exe):$(wildcard *.c)gcc -o $@ $^.PHONY:cleanclean:rm -f $(exe)echo "clean object files"
相关文章:
linux编程──gcc和clang
实验链接 编译原理实验-GCC/Clang工具链在ARM架构上的使用 实验报告 第1关:理解程序的不同表示形式 ##问题1-1: 如果在命令行下执行 gcc -DNEG -E sample.c -o sample.i生成的sample.i 与之前的有何区别? 根据定义NEG,而选择了M定义为-4…...

字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...
在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 但说实话,想进大厂还真没那么容易。最近面试字…...

5.多线程学习
作者:爱塔居 专栏:JavaEE 作者简介:大三学生,喜欢总结与分享~ 文章目录 目录 文章目录 章节回顾 一、wait 和notify 二、设计模式 2.1 单例模式 章节回顾 线程安全 1.一个线程不安全的案例(两个线程各自自增5w次&…...

数据结构中的堆
一、树的重要知识点 节点的度:一个节点含有的子树的个数称为该节点的度(有几个孩子)叶节点或终端节点:度为0的节点称为叶节点;如上图:B、C、H、I...等节点为叶节点(0个孩子)非终端节点或分支节点…...

Linux内核设备信息集合
本文结合设备信息集合的详细讲解来认识一下设备和驱动是如何绑定的。所谓设备信息集合,就是根据不同的外设寻找各自的外设信息,我们知道一个完整的开发板有 CPU 和各种控制器(如 I2C 控制器、SPI 控制器、DMA 控制器等)࿰…...

若依框架---权限管理设计
前言 若依权限管理包含两个部分:菜单权限 和 数据权限。菜单权限控制着我们可以执行哪些操作。数据权限控制着我们可以看到哪些数据。 菜单是一个概括性名称,可以细分为目录、菜单和按钮,以若依自身为例: 目录,就是页…...
Java设计模式(二)——工厂模式
当用户需要一个类的子类实例,且不希望与该类的子类形成耦合或者不知道该类有哪些子类可用时,可采用工厂模式;当用户需要系统提供多个对象,且希望和创建对象的类解耦时,可采用抽象工厂模式。 工厂模式一般分为简单工厂、…...

【Maven】
MavenMaven简介仓库坐标Maven项目构建依赖管理生命周期及插件插件模块拆分与开发聚合继承属性版本管理资源配置多环境开发配置跳过测试私服Maven简介 Maven的本质时一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM) POM(Project Object Model)&a…...

[JAVA]继承
目录 1.继承的概念 2.继承的语法 3.父类成员访问 3.1子类中访问父类成员变量 3.2子类中访问父类成员方法 4.super关键字 5.子类构造方法 6.继承方式 7.final关键字和类的关系 面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复…...

Vue3 pinia持久化存储(组合式Api案例演示)
pinia-plugin-persist( pinia持久化插件) 本文采用的是 组合式Api的方式来做Pinia的持久化存储演示 如果对pinia的持久化还是不是很了解的👨🎓|👩🎓,可以看一下笔者的上一篇文章…...
8个你一看就觉得很棒的Vue开发技巧
1.路由参数解耦 通常在组件中使用路由参数,大多数人会做以下事情。 export default {methods: {getParamsId() {return this.$route.params.id}} }在组件中使用 $route 会导致与其相应路由的高度耦合,通过将其限制为某些 URL 来限制组件的灵活性。 正…...

vue3+ts 开发效率提升
1、vite pnpm项目初始化 pnpm: 比npm或yarn快10倍 pnpm与其他包管理器(如npm和Yarn)的不同之处在于它使用一种称为“硬链接”的独特安装方法。当你使用PNPM安装一个包时,它并不会将包的文件复制到每个项目的node_modules目录中&a…...

【数据结构与算法】队列和栈的相互实现以及循环队列
目录🌔一.用队列实现栈🌙1.题目描述🌙2.思路分析🌙3.代码实现⛈二.用栈实现队列☔1.题目描述☔2.思路分析☔3.代码实现🌈三.实现循环队列🌔一.用队列实现栈 🌙1.题目描述 我们先看一下题目链接…...
mysql连接不上问题解决
公司新搭内网测试环境,mysql远程登录问题解决 远程登录: 1 修改host, mysql> select user,host,plugin from user; ---------------------------------------------------- | user | host | plugin | ------------------------…...

利用nginx实现动静分离的负载均衡集群实战
前言 大家好,我是沐风晓月,今天我们利用nginx来作为负载,实现两台apache服务器的动静分离集群实战; 本文收录于沐风晓月的专栏《linux基本功-系统服务实战》,更多内容可以关注我的博客: https://blog.csd…...

与chatGPT神聊,引领你深入浅出系统调用
在操作系统的教学中,系统调用的作用不言而喻,但是,对系统调用常常是雾里看花,似乎明白,又难以真正的触及,即使在代码中调用了系统调用,比如调用fork()创建进程࿰…...

自学大数据第十天~Hbase
随着数据量的增多,数据的类型也不像原来那样都是结构化数据,还有非结构化数据; Hbase时google 的bigtable的开源实现, BigtableHbase文件存储系统GFSHDFS海量数据处理MRMR协同管理服务chubbyzookeeper虽然有了HDFS和MR,但是对于数据的实时处理是比较困难的,没有办法应对数据的…...
vue更高效的工具-vite
目录 1.webpack 2.vite是什么 3.使用vite创建项目 4.最后总结 🐼webpack 简单来说,Webpack是一个打包工具。 站在2018年的角度,成为一个优秀的前端工程师,除了要会写页面样式和动态效果之外,还需要会用主流的单页…...

HFish蜜罐的介绍和简单测试(一)
目录 0、什么是蜜罐 0.1、蜜罐的定义 0.2、蜜罐的优势 0.3、蜜罐与情报 1、HFish介绍 1.1、设计理念 1.2、HFish架构 1.3、HFish特点 1.4、常见蜜罐场景 2、快速部署 2.1、环境要求 2.2、联网环境,一键安装 2.3、安装效果 3、错误排查 3.1、管理端问题…...
2023面试题汇总二
一、CSS面试题 1. 清除浮动的方式有哪些? 为什么要清除浮动?因为浮动的盒子脱离标准流,如果父盒子没有设置高度的话,下面的盒子就会撑上来。 额外标签法(在最后一个浮动标签后,新加一个标签,给其设置cle…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...