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

如何让gnu链接器创建一个类似于.bss的输出节?

GNU链接器(ld)是一个用于将目标文件链接成可执行文件或共享库的工具。在链接过程中,链接器会将各个目标文件中的节(section)合并成输出文件的节。

.bss节是一种特殊的节,用于存放未初始化的全局变量和静态变量。它在可执行文件中不占用实际的磁盘空间,而是在程序运行时由操作系统动态分配内存并初始化为0。

要让GNU链接器创建一个类似于.bss的输出节,可以使用链接器的命令行选项来指定输出文件的节属性。具体步骤如下:

  1. 编写源代码文件,包含未初始化的全局变量或静态变量。
  2. 使用编译器将源代码文件编译成目标文件。例如,使用GCC编译器将C语言源代码文件编译成目标文件:
  3. 使用编译器将源代码文件编译成目标文件。例如,使用GCC编译器将C语言源代码文件编译成目标文件:
  4. 使用GNU链接器将目标文件链接成可执行文件或共享库,并指定输出文件的节属性。可以使用链接器的--section选项来指定输出文件的节属性,其中包括节的名称、属性和大小等信息。例如,使用ld链接器将目标文件链接成可执行文件,并创建一个类似于.bss的输出节:
  5. 使用GNU链接器将目标文件链接成可执行文件或共享库,并指定输出文件的节属性。可以使用链接器的--section选项来指定输出文件的节属性,其中包括节的名称、属性和大小等信息。例如,使用ld链接器将目标文件链接成可执行文件,并创建一个类似于.bss的输出节:
  6. 上述命令中,--section .mybss=aw表示创建一个名为.mybss的节,属性为aw(allocatable和writable),即可分配和可写。
  7. 完成链接过程后,可执行文件中将包含一个类似于.bss的输出节,用于存放未初始化的全局变量和静态变量。

需要注意的是,上述步骤中的命令行选项和参数可能会因不同的操作系统和链接器版本而有所差异。建议查阅链接器的文档或手册,以了解具体的命令行选项和使用方法。

腾讯云提供了云计算相关的产品和服务,如云服务器、云数据库、云存储等。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多相关信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器

问题背景假设我们需要创建一个类似于微软计算器的 GUI 计算器。这个计算器应该具有以下功能:能够显示第一个输入的数字。当按下运算符时,输入框仍显示第一个数字。当按下第二个数字时,第一个数字被替换。...解决方案为了解决这个问题,我们需要使用状态的概念。每次按下按键时,检查状态并确定要采取的操作。起始状态:输入数字。当按下运算符按钮时:存储运算符,改变状态。...当按下另一个数字时:存储数字,清除数字输入,重新开始数字输入。当按下等号按钮时:使用存储的数字和运算符以及数字输入中的当前数字,执行操作。...使用动态语言,例如 Python,可以改变处理按键/按钮按下事件的函数,而不是使用变量和 if 语句来检查状态。...self.state = "number" # 创建数字列表 self.numbers = [] # 创建运算符列表 self.operators

13510

扒一扒ELF文件

链接举例   在介绍ELF文件之前,我们先看下,一个.c程序是如何变成可执行目标文件的。下面举个例子。   该程序由main.c和sum.c两个模块组成。...最后,链接器(ld) 将可重定位的目标文件main.o和sum.o以及一些必要的系统文件组合起来,创建一个可执行目标文件prog。具体过程如下图所示。 ?...链接过程   由上面的过程,我们可以看出在经过汇编器后会输出一个.o文件,这个叫做可重定位的目标文件。将main.o和sum.o输入链接器后,链接器输出的prog文件叫做可执行目标文件。...ELF文件作用   ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待ELF格式的文件:   1.如果用于编译和链接(可重定位文件),则编译器和链接器将把...data节和.bss节会被装入读写数据段。 段头表能够描述可执行文件中的节与虚拟空间中的存储段之间的映射关系。一个表项32B,说明虚拟地址空间中一个连续的片段或一个特殊的节。

78320
  • ELF文件从形成到加载轮廓

    包含适合与其他目标文件链接,以创建可执行文件或共享目标文件的代码和数据。 这些文件是在编译阶段生成的,通常通过 gcc -c 命令生成,尚未进行最终的地址解析和链接。...Section 合并细节: 链接器读取每个目标文件的节头表(Section Header Table),识别 .text(代码)、.data(初始化数据)、.bss(未初始化数据)、.rodata...编译器创建 .symtab Section,记录符号的名称、类型和临时地址(相对于 Section 的偏移)。 如果符号是外部引用(未定义),标记为 UND,等待链接器处理。...如何查看 .symtab 您可以使用以下命令查看符号表: 使用 nm 命令: $ nm hello.o # 查看目标文件的符号表 $ nm a.out # 查看可执行文件的符号表 - 输出显示符号名称...一个段可能包含多个节(比如 .text 和 .rodata 合成一个只读段)。段的偏移量记录在程序头表中。 节:由节头表管理,用于链接和调试。节的偏移量记录在节头表中,可能与段的偏移量重叠。

    7910

    Arm放弃了自家的汇编语法?改投GNU了?

    ARM系列文章,请点击以下汇总链接: 《从0学arm合集》 一、MDK和GNU伪指令区别 我们在学习汇编代码的时候经过会看到以下两种风格的代码: gnu代码开头是: .global _start...32位的常数和一个地址到寄存器。...合并成一个.data section; .bss : { *(.bss) } : 将所有输入文件的.bss section合并成一个.bss section;该段通常存放全局未初始化变量 . = ALIGN...(4);表示下面的段4字节对齐 连接器每读完一个section描述后, 将定位器符号的值增加该section的大小。...File) 可执行文件(Executable) 共享库(Shared Object,或者Shared Library) ELF格式提供了两种不同的视角,链接器把ELF文件看成是Section的集合,而加载器把

    2.3K30

    你的变量究竟存储在什么地方?

    可重定位的目标文件:包含二进制代码和数据,与其他可重定位目标文件合并起来,创建一个可执行目标文件。 2. 可执行的目标文件:包含二进制代码和数据,其形式可以被直接拷贝到存储器中并执行 3....当链接器吧这个目标文件和其他文件结合时,.text节中的信息需修改 .rel.data 被模块定义和引用的任何全局变量的信息 .debug 一个调试符号表。...和.bss中为每个定义分配空间,并在.symtab节中创建一个有唯一名字的本地链接器符号。...下面我们在通过符号表来解释变量的存储。 每个可重定位目标文件都有一个符号表,它包含该文件所定义和引用的符号的信息。在链接器的上下文中,有三种不同的符号: 1....变量c对应的索引为4(.bss段),变量a对应的索引是COM,最终当该程序被链接时,它将做为一个.bss目标分配。

    1.8K10

    9_重定位

    bss段 09 int g_intB; //存储在 .bss段 9.1.2 步骤2:创建链接脚本 ​ 这里先用着链接脚本,具体如何使用会在《章节9-1.2 链接脚本分析》中详细说明 ​ 链接脚本...,它规定如何把输入文件内的段放入输出文件, 并控制输出文件内的各部分在程序地址空间内的布局。 ​...所以我们将.data段重定位后的地址设置为0x900000。 9.3.2.4 步骤2:修改链接脚本 ​ 创建一个变量用来存储.data段的起始加载地址。...9.4 C函数重定位data段和清除bss段 ​ 到目前为止我们已经通过汇编实现了重定位data段和清除bss段。为了让汇编程序更加简洁,这一节中我们将通过C语言实现重定位data段和清除bss段。...原因:C函数中定义一个全局变量int g_i = 10;,程序中必然有4字节的空间留出来给这个变量g_i,然而链接脚本中的变量并像全局变量一样都保存在.bin文件中。

    1K10

    RT-thread finsh移植到linux平台

    C 语言解释器模式下,FinSH 能够解析执行大部分 C 语言的表达式,并使用类似 C 语言的函数调用方式访问系统中的函数及全局变量,此外它也能够通过命令行方式创建变量。...FinSH移植 FinSH作为RT-Thread的组件, 是以一个独立的线程形式存在, 要将其移植到linux平台,需要对底层相关调用,诸如线程,信号, 标准输入输出等方面进行移植,移植相关的基本介绍可阅读官方提供的...链接、链接脚本 要实现C-Style模式, 还必须借助链接脚本对程序进行特殊的控制(文件是计算机操作的基本单位,而段则是链接器操作的基本单位。一个文件中可以包含一个或多个段。...Fsymtab段中定义的函数 上述两个技巧可以在主流的编译器链接器上适用, 利用编译器的特性我们很容易实现将函数放在指定的段中,然而每次都要修改链接脚本就显得不那么方便(想要了解linux默认链接脚本的同学可以参考...答案是有的, 就是继续利用编译器的特性, 这将特别依赖于编译器的种类,不同编译器提供的实现方式往往不同,下面我们列举几种不修改链接脚本的实现方式: #ifdef FINSH_USING_SYMTAB #

    3.3K10

    ELF文件格式简介

    比如编译的中间产物.o文件; 可执行文件:一个可执行文件; 共享目标文件:共享库。文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。比如linux下的.so文件。...程序头表描述了ELF文件中Segment在文件中的布局,描述了OS该如何装载可执行文件到内存。程序头表的表项的描述如下,类似于ELF Header也有32和64位两个版本。...段和节的区别是: 段包含了程序装载可执行的基本信息,段告诉OS如何装载当前段到虚拟内存以及当前段的权限等和执行相关的信息,一个段可以包含0个或多个节; 节包含了程序的代码和数据等内容,链接器会将多个节合并为一个段...符号的值给出了对齐约束,类似于节的 sh_addralign 成员。 也就是说,链接编辑器将为符号分配存储空间,该地址是 st_value 的倍数。...当链接编辑器将此对象文件与另一个定义指定符号的文件组合时,此文件对符号的引用将链接到实际定义; st_other:该成员当前持有 0 并且没有定义的含义; st_shndx:每个符号都有属于的节,当前成员存储的就是对应节的索引

    2.2K31

    【linux命令讲解大全】054.readelf:展示ELF格式文件信息的工具

    这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到...ELF文件作用 ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件: 如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合...如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。 如果是共享文件,则两者都含有。...链接相关:节头表相关信息。 选项 -a 或 --all:显示全部信息,等价于 -h -l -S -s -r -d -V -A -I。...-H 或 --help:显示readelf所支持的命令行选项。 -W 或 --wide:宽行输出。 @file:可以将选项集中到一个文件中,然后使用这个@file选项载入。

    70110

    认识目标文件结构

    从命令 readelf -S test.o 的输出结果可以看到,.bss段的大小是4个字节,这与 gUninitVar 和 staVar1的8字节大小不符。...这其实和不同语言与编译器的实现有关,有些编译器会将全局未初始化变量放在.bss段,有些则不放,只是预留一个未定义的全局变量符号,等到最终链接成可执行文件的时候再在.bss段分配空间。...(2)链接时,读取了所有目标文件,确定了任意一个弱符号的大小。这时才在最终输出文件的.BSS段中为其分配空间。 (3)总体看来,未初始化的全局变量最终还是被放在.BSS段。...我们也可以将一个数据段命名为“.text”,对于编译器和链接器来说,主要决定段的属性的是段的类型(sh_type)和段的标志位(sh_flags)。...11.代码段重定位表(.rela.text) 通过命令 readelf -S的输出可以看到,test.o有一个段 .rela.text,其类型为 RELA,也就是说它是一个重定位表,用于链接器在处理目标文件时

    1.2K30

    Linux可执行文件与进程的虚拟地址空间

    Linux可执行文件与进程的虚拟地址空间 一个可执行文件被执行的同时也伴随着一个新的进程的创建。...Linux会为这个进程创建一个新的虚拟地址空间,然后会读取可执行文件的文件头,建立虚拟地址空间与可执行文件的映射关系,然后将CPU的指令指针寄存器设置成可执行文件的入口地址,然后CPU就会从这里取指令执行...通过readelf -S name.elf可以查看ELF可执行文件的节头表,这里面有所有节的信息 ? 在将目标文件链接成可执行文件的时候,链接器会尽量把相同权限属性的段分配在同一空间。...从装载的角度看,我们只关心两个“LOAD”型的segment,因为只有它是需要被映射的,其他诸如“NOTE”,"GNU_STACK"都是在装载时起辅助作用的。...所以在将目标文件链接成可执行文件的时候,链接器会尽量把相同或相似权限属性的section分配在同一空间,在程序头表中,将一个或多个属性类似的section合并为一个segment,然后在装载的时候,将这个

    4.3K30

    gccc如何处理static变量初始化

    局部/全局变量 局部变量在C++中的使用要频繁的多,并且功能也强大的多,但是这些强大功能的背后无疑会引入问题的复杂性,不想让马儿吃草只想让马儿跑的事大家表乱想。...这些初始化的实现就需要C++的库执行更多的动作来完成,虽然各种编译器都是像如今开展的“学雷锋”活动一样干了很多好事都没有留名,但是作为一个程序员,还是要对别人的贡献进行表彰。...如何定位该节 这个在链接时使用的可执行文件就是我们比较常见的crtbegin.o和crtend.o这两个文件,当然大家可能没有注意到过着两个文件,因为通常我们执行g++编译的时候会由编译器来自动添加,这里我就不举比方...init节的夹击的,在真正的_start函数将会调用_init函数,这个函数就卡在所有的init节的两侧从而相当于使用连接器在它们直接加入了所有的连接输入文件的.init节,所以.init节中必须不能主动...和通常的gnu软件一样,它比较晦涩,但是对于一个已经相当习惯的同学例如我来说,还是没有啥大问题的,所以我就不解释的,知道这里为了防止多线程,gcc直接使用了锁就好了,你也不用担心这里的多线程问题,Let

    75461

    Linux命令(65)——ld命令

    1.命令简介 ld命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行程序或库文件。...>,--mri-script=:为与MRI链接器兼容,ld接受由MRI命令语言编写的脚本文件 --cref:创建跨引用表 -d,-dc,-dp:即使指定了可重定位的输出文件...这告诉动态链接器,正在创建的共享对象的符号表应该用作共享对象名称的符号表的筛选器。 -g:被忽略。.../写入文本和数据段 -n,--nmagic: 关闭节的页面对齐,并禁用对共享库的链接。...如果输出格式支持Unix样式的幻数,则将输出标记为"NMAGIC" -noinhibit-exec:生成输出文件,即使出现非致命链接错误。通常,如果链接器在链接过程中遇到错误,它将不会生成输出文件。

    17.7K13

    程序一定要从main函数开始运行吗?

    对于静态链接先提出两个问题: Q: 每个目标文件都有好多个段,目标文件在被链接成可执行文件时,输入目标文件中的各个段如何被合并到输出文件?...A: 合并相似的段,将所有的.text段合并到输出文件的.text段,将所有的.data段合并到输出文件的.data段。 Q: 链接器如何为他们分配在输出文件中的空间和地址?...,这会导致链接输出文件变的很大,造成空间浪费。...有一个编译选项叫函数级别链接,可以使得某个函数或变量单独保存在一个段里面,都链接器需要用到某个函数时,就将它合并到输出文件中,对于没用到的函数则将他们抛弃,减少空间浪费,但这会减慢编译和链接过程,GCC....*) } /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } } 这里自定义一个简单的链接脚本test.lds

    1.3K30

    嵌入式链接脚本(LINK SCRIPT)介绍

    链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情....连接器有个默认的内置连接脚本, 可用ld--verbose查看. 连接选项-r和-N可以影响默认的连接脚本(如何影响). -T选项用以指定自己的链接脚本, 它将代替默认的连接脚本。...你也可以使用的连接脚本>以增加自定义的链接命令. 以下没有特殊说明,连接器指的是静态连接器. . 基本概念 链接器把一个或多个输入文件合成一个输出文件....输入文件: 目标文件或链接脚本文件. 输出文件: 目标文件或可执行文件. 目标文件(包括可执行文件)具有固定的格式, 在UNIX或GNU/Linux平台下, 一般为ELF格式....,最后一个文件的.datasection 下面看连接器是如何找到对应的文件的。 当FILENAME是一个特定的文件名时,连接器会查看它是否在连接命令行内出现或在INPUT命令中出现。

    2.4K40

    X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编

    如果你在.bss 节不小心给一个变量赋了初值,这个值也会丢失,并且变量的值仍为0。使用.bss 比使用.data 的优势在于,.bss 节不占用磁盘的空间。...在磁盘上,一个长整数就足以存放.bss 节。当程序被装入到内存时,操作系统也只分配给这个节4 个字节的内存大小。...section .text :这个节包含程序的代码,它是只读节,而.data 和.bss 是读/写节。...org 只能增加位置计数器的值,或者让其保持不变;但绝不能用.org 来让位置计数器倒退。 注意,位置计数器的起始值是相对于一个节的开始的,而不是子节的开始。...• 输出部分(output),用以规定对输出变量(目标操作数)如何与寄存器结合的约束(constraint),输出部分可以有多个约束,互相以逗号分开。

    3.2K00

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

    main函数的功能 4.树莓派4串口外设程序 4.1 设置gpio的功能 4.2 配置串口控制器 5.总结 1.前言 当我们去研究一个系统的时候,首先需要从最简单的程序开始入手。...树莓派4裸机基础教程:环境搭建 树莓派4裸机基础教程:芯片启动到代码执行 本文主要从最简单的裸机代码开始分析,让板子的串口可以输出hello world信息。...这篇文章会介绍工程的构建,程序的运行等等一些列的流程,以及树莓派4最后如何输出hello world。...需要注意的是.bss段包含的是初始化为零的数据,通过将这些数据放在一个单独的节中,编译器可以在elf文件中省略一些空间。所以需要记录bss_start与bss_end段。并且将这段空间对齐。...4.树莓派4串口外设程序 在做嵌入式的时候,我们总是希望设备与自己是有交互的,比如点亮一个led,或者用串口输出一段字符等等。这都表示程序正常运行。所以会写简单的交互程序也非常的重要。

    2.7K30

    Linux系统下刨析hello world背后的秘密

    它的作用是将头文件的内容包含到本文件中。该头文件中的所有代码都会在#include处展开。可以通过gcc -E helloworld.c在预处理后自动停止后面的操作,并把预处理的结果输出到标准输出。...gcc的-S选项会让gcc在编译完成后而停止,这样就会产生对应的汇编文件。 汇编汇编的过程比较简单,就是将源代码翻译成可执行的指令,并生成目标文件。...对应的gcc命令为gcc -c helloworld.c -o helloworld.o。 链接链接是生成可执行程序的最后步骤,也是比较复杂的一步。...它就是将各个目标文件,包括库文件链接成一个可执行程序。在这个过程中,在Linux环下,该工作是由GNU的链接器ld完成的。 2. hello world可执行程序是什么文件?...bss段用于保存没有初始值或初值为0的全局变量和静态变量,当程序加载时,bss段中的变量会被初始化为0。 除此之外还有其他常见的段: debug段:用于保存调试信息,如果不使用-g选项,则不会生成。

    61920

    Linux下c程序的内存映像

    前言 今天开始分享C语言里面的存储类型、作用域、生命周期、链接属性等知识点,我们写完一个程序,不只说知其,更要知其所以然。...(2)内存有多种管理方法:栈、堆、数据段、bss段、.text段等,其实这个Linux环境可以查看以ELF结尾的可执行程序,可以看到所说的这些的;一个变量的存储类属性就是描述这个变量存储在何种内存段中。...代码块就是一对大括号{}括起来的范围,所以一个变量的作用域是:这个变量定义所在的{}范围内从这个变量定义开始往后的部分。(这就解释了为什么变量定义总是在一个函数的最前面)。...- 链接属性 - (1)大家知道程序从源代码到最终可执行程序,经历的过程:编译、链接。 (2)编译阶段就是把源代码搞成.o目标文件,目标文件里面有很多符号和代码段、数据段、bss段等分段。...(3)每一个进程都活在自己独立的进程空间中,0-3G的空间每一个进程是不同的(因为用了虚拟地址技术),但是内核是唯一的。

    3K20
    领券