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

了解nostdlib C程序的ELF二进制大小

对于nostdlib C程序的ELF二进制大小,首先需要了解nostdlib是指在编写C程序时不使用标准库(libc)的情况。ELF(Executable and Linkable Format)是一种用于可执行文件、目标文件、共享库等的文件格式。

对于nostdlib C程序的ELF二进制大小,主要取决于以下几个因素:

  1. 代码大小:nostdlib C程序的ELF二进制大小主要受到代码部分的影响。由于不使用标准库,程序需要自行实现一些常用的功能,如内存分配、字符串操作等。因此,代码可能会比使用标准库的程序更大。
  2. 依赖的库文件:即使是nostdlib程序,仍然可能依赖一些系统库文件,如动态链接器和系统调用。这些库文件的大小也会对ELF二进制大小产生影响。
  3. 符号表和调试信息:ELF文件中包含了符号表和调试信息,用于调试和符号解析。这些信息也会增加ELF二进制的大小。
  4. 优化选项:编译器的优化选项也会对ELF二进制大小产生影响。一些优化选项可能会减小代码的大小,但也可能会导致可读性和调试性下降。

对于nostdlib C程序的ELF二进制大小,可以使用一些工具来查看和分析,如readelf、size等。这些工具可以提供关于ELF文件中不同部分的详细信息,包括代码大小、数据大小、符号表大小等。

在腾讯云的云计算平台中,可以使用腾讯云函数(Serverless Cloud Function)来部署和运行nostdlib C程序。腾讯云函数是一种无服务器计算服务,可以让开发者仅关注代码逻辑而不用担心底层基础设施的管理。您可以使用腾讯云函数来快速部署和运行nostdlib C程序,并提供灵活的资源配置和弹性扩展能力。

相关链接:

  • 腾讯云函数产品介绍:https://cloud.tencent.com/product/scf
  • readelf命令文档:https://linux.die.net/man/1/readelf
  • size命令文档:https://linux.die.net/man/1/size
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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串行通信。

91840

详解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.6K20
  • 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:不连接系统标准启动文件和标准库文件,只把指定文件传递给连接器。

    3.1K21

    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

    用Eclipse开源IDE+gcc编译器开始嵌入式编程

    最近有个项目,不能在Keil uVision4 MDK中开发,只能在linux下并使用命令行GCC编译器,手动写makefile,对于习惯了IDE开发者来说多少有些不适应,尤其是查找函数定义之类不方便...于是成功实现了使用EclipseIDE,并配合GCC编译器开发嵌入式应用程序。Eclipse和GCC环境搭建先略过,查资料都好解决。...先贴出makefile模版,因为没有使用EclpiseCDT自动生成makefile,所以这里 makefile是必须。...mno-unaligned-access -fno-zero-initialized-in-bss -D_POS_S80 -D_APPMANAGER LDSCRIPT = mapp.ld LDFLAGS =  -nostdlib...ifeq (YES, ${STRIP_RELEASE}) ${STRIP} ${TARGET}.elf endif %.o : %.c ${CC} -c ${CFLAGS} ${INCS} -o $@

    1.1K20

    树莓派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.5K30

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

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

    57930

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

    生成可重定位目标文件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中二进制代码“拷贝”可执行文件中,我们程序在其他没有上面的动态库时,将无法正常运行。...可执行文件大小不一样 从前面也可以观察到,静态链接可执行文件要比动态链接可执行文件要大得多,因为它将需要用到代码从二进制文件中“拷贝”了一份,而动态库仅仅是复制了一些重定位和符号表信息。

    1K20

    几个命令了解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

    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.9K30

    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.9K30

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

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

    4.3K50
    领券