首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CEO亲自写代码登上热榜,从零开始打造“裸金属”树莓派

所谓“裸金属”就是没有操作系统计算机,直接在逻辑硬件上执行指令。这位CEO说,打造一个裸金属系统是他儿时志向。 所以就有了这串,从零开始到成功运行Hello World,再到运行小游戏程序。...CFILES = $(wildcard *.c) OFILES = $(CFILES:.c=.o) GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib...-none-elf-gcc $(GCCFLAGS) -c boot.S -o boot.o %.o: %.c $(GCCPATH)/aarch64-none-elf-gcc $(GCCFLAGS) -c...$< -o $@ kernel8.img: boot.o $(OFILES) $(GCCPATH)/aarch64-none-elf-ld -nostdlib boot.o $(OFILES) -T...不过树莓派在这一通操作后只能运行启动画面,之后只剩下一个空黑屏。 然后就是让树莓派程序员熟悉“Hello World”程序,但是在一台黑屏机器上如何运行呢?这就需要用到UART串行通信。

90440

详解ELF重定向原理

重定向是计算机技术中非常底层概念和操作。它指的是将程序中涉及到变量名与变量在计算机内存中位置关联起来。...当在代码中执行类似x=1;语句时,编译器需要通过重定向信息找到变量x对应内存位置,然后将数值1写入该内存,因此重定向既跟程序加载链接有关,又与编译原理有关,因此对计算机体系结构不了解,或只关注上层应用开发...例如下面代码: void _start() { foo() } 如果boo实现放在一个obj1.c文件,函数foo实现放在boj2.c文件,那么编译后_start函数对应二进制指令存储在obj1....o中,foo对应二进制指令存储在obj2.o中,于是整个程序要顺利执行,就必须将obj1.o和obj2.o整合在一起,负责整合工作就是连接器,它位于Linux系统目录/bin/ld中。...-nostdlib objj1.o obj2.o -o relocated 将两个.o文件链接成relocated文件,然后使用命令objdump -d relocated查看链接后内容: ?

2.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

liteos动态加载(十三)

概述 1.1 基本概念 动态加载是一种程序加载技术。 静态链接是在链接阶段将程序各模块文件链接成一个完整可执行文件,运行时作为整体一次性加载进内存。...动态加载允许用户将程序各模块编译成独立文件而不将它们链接起来,在需要使用到模块时再动态地将其加载到内存中。 静态链接将程序各模块文件链接成一个整体,运行时一次性加载入内存,具有代码装载速度快等优点。...但当程序规模较大,模块变更升级较为频繁时,会存在内存和磁盘空间浪费、模块更新困难等问题。...-nostdlib -c $< -o $@ $(SOS): %.so : %.c @$(CC) -mlong-calls -nostdlib $< -fPIC -shared -o $@ clean...动态加载所需分配堆内存大小视要加载模块而定,因此如果用户需要指定自定义堆时,需要保证堆长度足够大,否则建议使用系统堆。

1.9K30

riscv64 裸机编程实践与分析

往往做嵌入式底层开发都需要关注这段汇编代码含义,这样在使用时候才能全面的了解启动时做了什么事情,在后续程序中遇到问题也能复盘推演。...源代码就是可以让cpu执行代码,通过交叉编译工具链编译生成可执行二进制程序。 链接脚本文件则可以告诉程序布局,比如代码段,函数入口等等。...通过反汇编来查看生成程序布局情况 # riscv64-unknown-elf-objdump -d hello hello: file format elf64-littleriscv...riscv64-unknown-elf-gcc -march=rv64g -mabi=lp64 -static -mcmodel=medany -fvisibility=hidden -nostdlib...-fvisibility=hidden:动态库部分需要对外显示函数接口显示出来。 -nostdlib:不连接系统标准启动文件和标准库文件,只把指定文件传递给连接器。

2.9K20

C语言程序判断计算机CPU大小

如何判断一台计算机CPU是大端还是小字端对齐呢?    那么首先得了解何为大端,何为小端,明确一下概念。    ...那么如何使用C语言程序判断CPU是大端还是小端对齐呢?    有几个方法:    方法一:直接使用看变量内存值,这里需要使用一些调试技巧。...运行结果为:                       0012FF7C                       34 12    方法二:使用C共用体: 请写一个C函数,若处理器是Big_endian...                                  int a;                                   char b;                }c;...              c.a=1;               return (c.b==1);             }    方法三:强制类型转换,和共用体做法差不多。

2.1K20

ELF文件程序表头和代码实现ELF文件加载

前面章节我们了解ELF文件头部结构,这次我们深入了解另一个非常重要数据结构,那就是程序表头。操作系统严重依赖该结构来加载ELF文件或是实现动态链接。...程序表头反映是当ELF加载到内存后所形成“视图”或结构,也就是说ELF文件存在硬盘上或者被加载到内存,它展现出来形态不一致。...; #在硬盘上大小 uint64_t p_memsz; #在内存中大小 uint64_t p_align; #内存对齐方式 } Elf64_Phdr; 使用命令 readelf...p_offset表示表头对应那些段起始地址,p_vaddr表示表头对应段该加载虚拟位置,p_filesz表示表头对应段在硬盘上大小,p_memsz表示表头对应段在加载到内存后大小。...最后p_align表示内存对齐方式,它取值为2指数,同时p_vaddr必须等于(p_offset % p_align) 了解ELF二进制内部原理后,我们需要实现手动加载ELF文件,实现这个目标,我们需要依赖一个库叫

1.6K30

树莓派4裸机基础教程:从hello world开始

-o kernel7.elf arm-none-eabi-objcopy -O binary kernel7.elf kernel7.img clean: rm kernel7.elf kernel7...kernel7.elf arm-none-eabi-objcopy -O binary kernel7.elf kernel7.img 通过arm-none-eabi-ld链接所以.o文件。...2.2 link.ld 链接文件 由于程序编译之后,需要进行链接,link文件告诉了程序链接规则。...特点是可读写,在程序执行之前BSS段会自动清0。 /* jump to C code, should not return */ ldr pc, _main 然后设置PC指针。...4.树莓派4串口外设程序 在做嵌入式时候,我们总是希望设备与自己是有交互,比如点亮一个led,或者用串口输出一段字符等等。这都表示程序正常运行。所以会写简单交互程序也非常重要。

2.3K30

万字图文 | 你写代码是如何跑起来

那么在编译启动运行过程中都发生了哪些事情了呢?今天就让我们来深入地了解一下。 一、理解可执行文件格式 源代码在编译后会生成一个可执行程序文件,我们先来了解一下编译后二进制文件是什么样子。...of this header:ELF 文件头大小,这里显示是占用了 64 字节 以上几个字段是 ELF 头中对 ELF 整体描述。...对于每一个段,输出了 Offset、VirtAddr 等描述当前段信息。Offset 表示当前段在二进制文件中开始位置,FileSiz 表示当前段大小。...Section 大小通过 Size 列体现。 在这 30 个Section中,每一个都有独特作用。我们编写代码在编译成二进制指令后都会放到 .text 这个 Section 中。...对于 ELF 文件来说,它加载器在内核中定义为 elf_format,其二进制加载入口是 load_elf_binary 函数。

54430

几个命令了解ELF文件”秘密“

来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com 前言 在Linux中,可执行文件格式是ELF格式,而有一些命令可以帮助我们了解它们更多“秘密”,以此来帮助我们解决问题...示例程序 我们示例程序如下: //来源:公众号【编程珠玑】 //hello.c #include int main(int argc,char *argv[]) { printf...如果不是可执行文件,它信息是怎样呢?举个例子: $ file hello.c hello.c: C source, UTF-8 Unicode text 看到了吧。...查看ELF文件各段大小 $ size hello text data bss dec hex filename 1210 552...为ELF文件瘦身 前面通过file查看文件时,看到有not stripped字样,由于它里面包含了一些符号表信息,因为文件会稍大,如果去掉,二进制文件将会变小,但是里面的符号表信息也就没有了,将会影响问题定位

2.3K20

一文带你了解静态库和动态库

生成可重定位目标文件main.o: $ gcc -c main.c #生成可重定位目标文件 $ readelf -h main.o #查看elf文件头部信息 ELF Header: Magic...什么是动态库 动态库和静态库类似,但是它并不在链接时将需要二进制代码都“拷贝”到可执行文件中,而是仅仅“拷贝”一些重定位和符号表信息,这些信息可以在程序运行时完成真正链接过程。...通常我们编译程序默认就是实用动态链接: $ gcc -o main main.c -lm #默认使用是动态链接 我们来看最终生成文件大小: $ ls -lh main -rwxrwxr-x 1...) 正因为我们并没有把libm.so中二进制代码“拷贝”可执行文件中,我们程序在其他没有上面的动态库时,将无法正常运行。...可执行文件大小不一样 从前面也可以观察到,静态链接可执行文件要比动态链接可执行文件要大得多,因为它将需要用到代码从二进制文件中“拷贝”了一份,而动态库仅仅是复制了一些重定位和符号表信息。

99720

Linux 程序编译过程来龙去脉

本文将介绍如何将高层C/C++语言编写程序转换成为处理器能够执行二进制代码过程,包括四个步骤: 预处理(Preprocessing) 编译(Compilation) 汇编(Assembly)...GCC GCC(GNU C Compiler)是编译工具。本文所要介绍C/C++语言编写程序转换成为处理器能够执行二进制代码过程即由编译器完成。...有关反汇编详细介绍,请参见后文。 readelf:显示有关ELF文件信息,请参见后文了解更多信息。...size:列出可执行文件每个部分尺寸和总尺寸,代码段、数据段、总大小等,请参见后文了解使用size具体使用实例。 C运行库 C语言标准主要由两部分组成:一部分描述C语法,另一部分描述C标准库。...以Hello World为例: 如果使用命令“gcc hello.c -o hello”则会使用动态库进行链接,生成ELF可执行文件大小(使用Binutilssize命令查看)和链接动态库(使用

2.9K30

Linux 程序编译过程详解

本文将介绍如何将高层C/C++语言编写程序转换成为处理器能够执行二进制代码过程,包括四个步骤:预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking...本文所要介绍C/C++语言编写程序转换成为处理器能够执行二进制代码过程即由编译器完成。...有关反汇编详细介绍,请参见后文。readelf:显示有关ELF文件信息,请参见后文了解更多信息。...size:列出可执行文件每个部分尺寸和总尺寸,代码段、数据段、总大小等,请参见后文了解使用size具体使用实例。C运行库C语言标准主要由两部分组成:一部分描述C语法,另一部分描述C标准库。...以Hello World为例:如果使用命令“gcc hello.c -o hello”则会使用动态库进行链接,生成ELF可执行文件大小(使用Binutilssize命令查看)和链接动态库(使用Binutils

1.8K30

9个基本GNU binutils 工具【Linux-Command-line】

汇编101 在深入研究binutils软件包本身之前,最好先了解编译基础知识。 编译是将程序从某种编程语言(C / C ++)源代码或文本形式转换为机器代码过程。...在呈现给定源文件可执行文件或二进制文件之前,编译过程将经历一系列复杂步骤。 以该源程序C代码)为例。...继续阅读以了解其他七个以上粗体突出显示GNU binutils软件包工具。 readelf:显示有关ELF文件信息 上面的练习提到了术语“目标文件”和“可执行文件”。...二进制文件入口点是地址0x400430,它只是C程序中main function地址。 在其他已知系统二进制文件(如ls)上尝试使用readelf命令。...剥离二进制文件后,此小程序大小从以前8440字节减小到6296。

4.2K50

Linux 程序编译过程详解

本文将介绍如何将高层C/C++语言编写程序转换成为处理器能够执行二进制代码过程,包括四个步骤: 预处理(Preprocessing) 编译(Compilation) 汇编(Assembly) 链接...本文所要介绍C/C++语言编写程序转换成为处理器能够执行二进制代码过程即由编译器完成。...有关反汇编详细介绍,请参见后文。 readelf:显示有关ELF文件信息,请参见后文了解更多信息。...size:列出可执行文件每个部分尺寸和总尺寸,代码段、数据段、总大小等,请参见后文了解使用size具体使用实例。 C运行库 C语言标准主要由两部分组成:一部分描述C语法,另一部分描述C标准库。...以Hello World为例: 如果使用命令“gcc hello.c -o hello”则会使用动态库进行链接,生成ELF可执行文件大小(使用Binutilssize命令查看)和链接动态库(使用

1.8K30
领券