首页
学习
活动
专区
工具
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

13410

扒一扒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,说明虚拟地址空间中一个连续片段或一个特殊

74420
  • 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.2K30

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

    可重定位目标文件:包含二进制代码和数据,与其他可重定位目标文件合并起来,创建一个可执行目标文件。 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文件中。

    99010

    RT-thread finsh移植到linux平台

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

    3.2K10

    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选项载入。

    58610

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

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

    4.3K30

    认识目标文件结构

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

    1.2K30

    gccc如何处理static变量初始化

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

    73261

    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.5K13

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

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

    1.2K30

    嵌入式链接脚本(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.1K00

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

    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选项,则不会生成。

    60620

    makefile使用.lds链接脚本以及 @,^, $,< 解析

    先来分析一个简单.lds链接脚本 ---- 例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: 1 SECTIONS {...c文件 %.o:%.S                  表示所有的.o文件,依赖于对应.S文件 ---- 当有多个.o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件中顺序?...这里就需要将多个目标文件.text、.data和.bss等段链接在一起而链接脚本文件是告诉链接从什么地址开始放置这些段 .text:代码段,存放程序执行代码一块内存 .data:读/写数据段,存放已初始全局变量或静态变量一块内存...当然我们一般都用手动-o进行指定,如果我们没有进行手动指定的话,输出文件名称就以这个FILENAME为输出文件名。 STARTUP(filename);指定filename为第一个输入文件。...SECTIONS :最重要,最基本,也是最主要命令,它告诉链接如何把输入文件各个section输出到目标文件中各个section中去。

    77420

    Linux命令(63)——nm令

    b,B 该符号值出现在非初始化数据段(BSS)中。例如,在一个文件中定义全局static int test。则该符号test类型为b,位于bss section中。...其值表示该符号在BSS段中偏移。 C 该符号为common。common symbol是未初始化数据。该符号没有包含在一个普通section中,只有在链接过程中才进行分配。...u 符号是唯一全局符号。这是GNU对标准ELF符号绑定集扩展。对于这样符号,动态链接将确保在整个过程中只有一个使用此名称和类型符号。...当链接未定义弱定义符号,弱符号值将变为零,且没有错误。在某些系统上,大写表示已指定默认值 w,W 该符号是一个弱符号,未专门标记为弱对象符号。...合成符号是链接为各种目的创建特殊符号,默认情况下不会显示它们,因为它们不是二进制文件源代码一部分 --target=:指定系统默认格式以外目标文件格式 4.常用示例 首先给出后面大部分示例所基于源代码以及编译指令

    5K00
    领券