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…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...

GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...