07 lds文件与自定义段

添加自定义的section 一、编译的程序(o so exe ko等等)都是elf格式进行排列的 elf文件分析情况:https://blog.youkuaiyun.com/edonlii/article/details/8779075 二、添加自己的section #define SECTION_START(_type,_name) \ static const struct mydyh_desc __mydyh_desc_##_type \ __attribute__((used, __section__(".dyh.info. 阅读详情

lds文件用于指定程序链接时的不同段内容的位置安排。linux内核镜像里就是利用lds文件,把不同的内容划分成很多不同的段.
uboot里的命令也就是利用此功能,把所有的命令统一到一个段里.

arm-linux-gnueabihf-ld –verbose > test.lds //把编译器默认的链接脚本输出到test.lds里

修改test.lds, 把最前的6行删除掉, 也要删除最后一行.
在84行加入自己的段:

  __mysection_start = . ;
  .mysection  :
  {
    *(.mysection);
  }
  .align = 4;
  __mysection_end = . ;

// __mysection_start 和 __mysection_end用于记录段的开始地址与结束地址.
*(.mysection) 表示所有的.o文件的.mysection段内容集中放起来

在代码里指定变量是分配在.mysection段:

    int num  __attribute__ ((section(".mysection"))) = 1;
    int num2 __attribute__ ((section(".mysection"))) = 2;
    int num3 __attribute__ ((section(".mysection"))) = 3;

编译时指定使用test.lds链接脚本:

arm-linux-gnueabihf-gcc test.c -Ttest.lds -o test

编译完成后,可以反汇编确认.mysection里的状况:

    arm-linux-gnueabihf-objdump -D test 
  查看到的输出:
    Disassembly of section .mysection:

    000083d4 <num>:
        83d4:       00000001        andeq   r0, r0, r1

    000083d8 <num2>:
        83d8:       00000002        andeq   r0, r0, r2

    000083dc <num3>:
        83dc:       00000003        andeq   r0, r0, r3

////////////////////////////////////////////////////////////////////
加进一个段后, 可以通过__mysection_start 和__mysection_end算出一个段的大小,及段里的变量个数.
也可以取出每个段里变量的值.

在代码里:
__mysection_start 相当于一个变量(类型不重要),它的地址就是段的开始地址
__mysection_end, 它的地址就是段的结束地址
实验代码:
test.c

    #include <stdio.h>

    int num __attribute__ ((section(".mysection"))) = 1;
    int num2 __attribute__ ((section(".mysection"))) = 2;
    int num3 __attribute__ ((section(".mysection"))) = 3;
    int num4 __attribute__ ((section(".mysection"))) = 55; 

    extern int __mysection_start; //这个变量是在链接脚本里声明的
    extern int __mysection_end;
    int main(void)
    {
        int *p = &__mysection_start;

        for (; p < &__mysection_end; p++)
        {   
        printf("%d\n", *p);
        }   

        return 0;
    }

以后再加变量到.mysection段里,main函数的代码可以不用修改都可以获取到相应的变量的值
////////////////////////////////////////
实现命令的功能:

test.c

    #include <stdio.h>

    typedef struct {
        char *name;  //命令的名字
        char *help; // 命令的帮助信息
        void (*func)(void); //命令的功能函数
    }cmd_t;

    #define MySection  __attribute__ ((section(".mysection")))

    #define ADD_CMD(name, help, func) \
        cmd_t __cmd_##name MySection = {#name, help , func}  

    void do_cmd1(void)
    {
        printf("in %s\n", __func__);
    }
    ADD_CMD(cmd1, "help of cmd1", do_cmd1);


    extern cmd_t __mysection_start;
    extern cmd_t __mysection_end;
    int main(void)
    {
        cmd_t *p = &__mysection_start;      

        for (; p < &__mysection_end; p++)
        {
            printf("%s\n", p->name);
            p->func();
            printf("#################\n");
        }
        return 0;
    }

// 再增加命令时,只需实现命令的功能函数后, 调用ADD_CMD宏即可.
// 也可以把每个命令用一个源文件来实现,最后一起编译即可。uboot里的命令就是采用这样的方法.

GCC编译四步和LDS脚本 GCC编译四步,以及链接脚本LDS的简单介绍 阅读详情

相关推荐

GNU Assembler

0、绪言 虽然现在嵌入式开发99%内容都是由 C(C++) 代码构成,但是一旦是做嵌入式,那就避免不了接触汇编代码,和汇编相关的内容,主要由汇编器、CPU 体系架构指令集构成; 使用不同汇编器的情况下,具体汇编实现的语法也会有部分出入,比如使用 MDK 那一套(ARM Assembler)和 GNU 那一套(GNU Assembler),汇编代码上,会有明显的不一样,这主要取决于汇编器; 本文侧重于 ARM GNU 的汇编部分; 可以参考的内容: 1. 网页版的内容: Using as...

StephenZhou 2962

Linux链接自定义一个section,So文件添加Section段详细说明

简介在逆向Android底层时,一般都或多或少的接触so文件,需要逆向so文件,一般的方法是往so文件植入我们的调试的代码;而通常都是通过添加section段来植入代码;查看本篇文章之前你需要先了解elf文件格式,so文件就是采用这种格式的简单介绍elf文件格式elf文件一般是由elf文件头、program header头(多个)、section段(多个)和section header头(多个组成...

weixin_36180515的博客 1356

u-boot分析 三 (u-boot.lds脚本)

u-boot分析 三 (u-boot.lds脚本)目的, 了解链接器用到的脚本文件u-boot.lds。在开始这篇博文之前,需要先了解一些GNU linker script的基本知识,可以参考博主的另外一篇分享《GNU linker script,ld script,GNU链接脚本》在《u-boot分析 二》中,我们分析u-boot的目录结构,提及到了程序入口start.S,但在开始了解start

老谢的自留地 1万+

gcc连接脚本lds详解

转载:blog.chinaunix.net/uid-28685940-id-3889918.html   我们对每个c或者汇编文件进行单独编译,但是不去连接,生成很多.o 的文件,这些.o文件首先是分散的,我们首先要考虑的如何组合起来;其次,这些.o文件存在相互调用的关系;再者,我们最后生成的bin文件是要在硬件中运行的,每一部分放在什么地址都要有仔细的说明。我觉得在写makefile的时候,...

weixin_34129696的博客 1025

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】004 - u-boot.lds 链接脚本源码 逐行深度解析

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】004 - u-boot.lds 链接脚本源码 逐行深度解析

|~~~热爱生活、努力学习的小伙汁~~~| 673

020、架构_配置文件_LDS(loadserver.ini)

该配置文件中的参数在后台配置,两种生效方式:*所有参数重启生效。配置文件“loadserver.ini”用于配置LoadServer模块运行时参数。配置文件格式一,IP地址进行映射,服务端口不变,在非注释行第一行配置mapping_type=1792。配置文件格式二,IP地址进行和服务端口都映射,在非注释行第一行配置mapping_type=0。“os.ini”配置文件说明、生效方式/修改方式参见“os.ini”。配置错误,进程退出。配置错误,进程退出。配置错误,进程退出。配置错误,使用默认值。

Oracle/MySQL 到 国产信创数据库|迁移 · 调优 · 信创替换 596

板级适配 · 链接脚本 lds(下)①:逐段解剖各内存段

裸机启动最劝退的就是链接脚本。这篇把 lds 拆成「逐间房看」:从向量表、代码段到 .data/.bss,连同 *、ALIGN、> SRAM 这些看不懂的符号,一次讲透。

通俗拆解嵌入式底层|STM32MP157|LiteOS-M 内核移植|嵌入式 AI 实战。配套工程源码,把晦涩原理变成可复现项目。 377

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cut&tag等富集峰的基因组注释

常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能获得有意义的结果。一般我们认为会产生两种类型的数据(当然两者并无严格意义上的区分)

微生信 3318

海思(Hi3521a)uboot详细分析(4)——链接文件u-boot.lds分析

u-boot.lds是U-boot的总链接脚本,通过根目录下的config.mk中LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds 知道我们使用的是位于u-boot-2010.06/arch/arm/cpu/hi3521a/ 里的u-boot.lds。 关于config.mk的分析可以参考博客《顶层config.mk分析》,其它.........

Biao 2042

SAP生产订单成本‘还原’实战:从标准成本到实际费用,一步步拆解差异来源(附物料分类账提示)

本文深入解析SAP生产订单成本差异分析的全过程,从标准成本到实际费用的追踪方法,揭示差异根源的六维分析法。特别强调物料分类账(CKMLCP)在成本还原中的关键作用,帮助财务人员精准定位价格差异、用量差异等问题,提升制造业成本管理的效率和准确性。

weixin_28705087的博客 532

Sobel原理及计算过程详解

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。首先,我们需要构建一个Sobel算子,通常是一个 3x3 的矩阵。Sobel算子可以分别计算水平和垂直方向的梯度值,然后将两者合并得到总梯度值。索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度近似值。所以,我们假设选择图像矩阵中的点A(1, 1),即第二行第二列的元素,对应的。接下来,我们将使用Sobel算子计算这个点的梯度值。

2301_76461741的博客 1万+

链接器ld程序的脚本文件u-boot.lds(二)

目的:了解链接器用到的脚本文件u-boot.lds。 在开始这篇博文之前,需要先了解一些GNU linker script的基本知识,可以参考博主的另外一篇分享《GNU linker script,ld script,GNU链接脚本》 之前分析了u-boot的目录结构,提及到了程序入口start.S,但在开始了解start.S之前,我们先聊聊链接器ld程序的脚本文件u-boot.lds。 下...

JustDoIt_201603的博客 475

X3850x6 6241 fireware固件升级

登录联想https://datacentersupport.lenovo.com/cn/zc网站,选择system x,x3850 x6,type选择6241 选择驱动及应用程序,BIOS/UEFI 选择lnvgy_fw_uefi_a9e156a-4.90_anyos_32-64.uxz 文件,点击下载 选择IMM2, 下载lnvgy_fw_imm2_tcoo58b-5.80_anyos_noarch.uxz ps:3837和3839会跳转到ibm网站下载 笔记本直连.

zds00virtue的博客 5452

板级适配_链接脚本lds下② _契约断言与照妖镜

lds 和启动文件谁是甲方谁是乙方?本文用一张「交接单」讲清双方的符号契约:lds 供给 `_estack/_sidata/_sdata/_sbss` 等门牌号,startup.S 按①~⑤步消费;再教你怎么用 `ASSERT` 把越界 bug 拦在编译期,并附 9 条「照妖镜」拿到任何新工程都能照着查。

通俗拆解嵌入式底层|STM32MP157|LiteOS-M 内核移植|嵌入式 AI 实战。配套工程源码,把晦涩原理变成可复现项目。 481

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景

本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。

weixin_30954265的博客 497

BDD测试用例:Playwright的MCP Server实战

Playwright MCP Server建立了大模型和真实的浏览环境之间的桥梁,可以让大模型操作多款浏览器完成测试任务。

Criss@陈磊 441

UBOOT启动过程及uboot.lds文件分析

uboot启动分两个阶段: 第一阶段:1.初始化CPU、内存                   2.为加载bootloader的stage2准备RAM空间                  3.拷贝bootloader的stage2代码到RAM空间                  4.设置好堆栈                  5.跳转到stage2的C入口点

riyue1108的专栏 850

[系统安全] 十六.PE文件逆向基础知识(PE解析和PE编辑工具)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~ 作者前面介绍了三个漏洞,包括Chrome浏览器保留密码渗透解析、通过Chrome浏

杨秀璋的专栏 1万+

uboot-链接脚本(u-boot.lds)

uboot链接脚本分析。

qq_41545736的博客 914

基于YOLOv11的农作物病虫害检测系统设计与实现

我们使用公开的IP102病虫害数据集作为基础,该数据集包含102种病虫害类别,覆盖水稻、小麦、玉米等多种主要农作物。图像数量:75,222张类别数:102图像分辨率:从640×480到4000×3000不等标注格式:PASCAL VOC格式此外,我们还收集了部分田间实际拍摄的图像以增强模型泛化能力。

YOLO 595

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C代码中如何使用链接脚本.lds中定义的变量

参考文章:https://sourceware.org/ml/binutils/2007-07/msg00154.html 在链接脚本中,经常有这样的代码: SECTIONS { ..... . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : {...

boazheng的博客 830

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

u-boot分析之u-boot.lds脚本

最近在研究Z-turn开发板uboot移植工作,发现了u-boot.lds脚本也是比较重要的,网上查阅了关于u-boot.lds脚本的相关信息,结合自己的开发板,对它进行了分析,      下面我们就来解读一下zturn开发板的u-boot.lds脚本,即u-boot/arch/arm/cpu/u-boot.lds。 OUTPUT_FORMAT("elf32-littlearm", "el

wendellluntan的博客 476

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

为什么Prism下载快15倍?多连接动态分段下载引擎原理全解析

Prism 是一款免费、开源的下载管理器(支持 Windows、macOS 和 Linux),它的 Rust 下载引擎通过**多连接动态分段下载**技术,在服务器"按连接限速"的场景下比单连接快 15 倍,本地测试甚至能跑出 1 GB/s 的写入速度。这篇文章带你读懂它背后的 3 个核心机制:探测零浪费、动态拆分(工作窃取)、慢尾竞跑,以及"为什么 32 个独立连接比 1 个 HTTP/2 连接更

gitblog_00410的博客 364

lds语法规则

lds语法规则  本文转自:http://www.cnblogs.com/china_blue/archive/2010/04/07/1705976.html 最近在看Linux内核时,总是遇到一些和连接脚本相关的东东,搞得人一头雾水,终于下定决心把它搞明白,写下一点心得,希望对和我一样的人有所帮助! 连接脚本的格式 ==========

zkpingguo的博客 1599
上一篇: 06 溢出攻击原理之汇编分析
下一篇: 08 uboot上增加自己的命令
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值