link script(链接器ld吃的文件)中使用宏定义的解决方案

问题:工作中遇到一个需求:需要在ld script中使用类似C语言的define等宏定义来做一些判断和替换

实验:

1:理论上*.c中都能用,是否gcc/ld也支持在ld script中直接用宏呢,结果:

arm-linux-ld:xxx.lds:2: ignoring invalid character `#' in expression
arm-linux-ld:xxx.lds:2: syntax error
人说水火无情,看来ld和gcc也不给面子啊。这里用的是交叉编译的ld,x86的也是一样的结论,本是同根生嘛。看来此路不通。

2:*.c中为什么能用define等宏呢,这个是在预编译阶段完成的。我们把gcc的预编译拿来先帮我们处理一次是否就可以了呢?带着疑问我们继续出发

先贴一份原始的ld script 吧:old.lds,里面有些define和注释哦

/*
 * comments like C style
 * if comments line is less than 2 lines like this, maybe generate some strange result
 *
 */
#ifdef __ARM__
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
#else
OUTPUT_FORMAT("elf32-littlends", "elf32-littlends", "elf32-littlends")
OUTPU
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`link_script.ldscript` 是一个链接脚本文件,用于定义链接在将目标文件链接成可执行文件时的行为和布局。该文件通常使用后缀名 `.ld` 或 `.lds`。 链接脚本文件包含了一系列指令和命令,用于描述如何组织和排列目标文件的节(sections),以及定义程序的入口点、内存布局、符号表等。它可以定义各个节在内存的起始地址、大小和对齐方式,以及链接如何处理重定位和符号解析。 一个典型的链接脚本文件包含以下内容: - 入口点(Entry Point):定义程序的入口点,指定程序从何处开始执行。 - 内存布局和节排列:定义程序在内存的布局,包括代码段、数据段、堆栈等各个节的起始地址、大小和对齐方式。 - 符号表和符号解析:定义链接如何处理符号表,包括链接时解析外部符号、符号重定位等。 - 重定位信息:指定链接如何处理代码和数据的重定位,即将目标文件的相对地址转换为最终的绝对地址。 链接根据链接脚本文件的定义,将目标文件进行适当的排列和重定位,生成最终的可执行文件。 需要注意的是,每个项目的链接脚本文件可能不同,具体的内容和语法会根据项目需求和目标平台而有所不同。建议查阅相应链接的文档和手册,以了解更多关于链接脚本文件的详细信息和示例。 请注意,`link_script.ldscript` 是一个示例文件名,实际的链接脚本文件名可能会有所不同,具体取决于项目设置和约定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值