【问题标题】:Embed revision number in executable binary在可执行二进制文件中嵌入修订号
【发布时间】:2019-12-11 20:41:43
【问题描述】:

我想在我的二进制文件中嵌入一个 git 修订标记,但链接器似乎将其剥离。

生成文件:

CPPFLAGS += -DREV=$(shell git describe)

文件.c:

#define xstr(s) str(s)
#define str(s) #s
const char rev[]="rev[" xstr(REV) "]";

标记存在于file.o中:

$ strings file.o | grep rev
rev[v1.0.1-5-ga45db7f-dirty]
GCC: (15:7-2018-q2-6) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]

但从 file.elf 中丢失:

$ strings file.elf | grep rev
GCC: (15:7-2018-q2-6) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]
GCC: (15:7-2018-q2-5) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]
GNU C11 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] -mthumb -march=armv6s-m -g -g -g -O2 -O2 -O2 -fbuilding-libgcc -fno-stack-protector -fno-inline -fvisibility=hidden
GNU C11 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] -mthumb -march=armv6s-m -g -g -g -O2 -O2 -O2 -fbuilding-libgcc -fno-stack-protector -fno-inline -fexceptions -fvisibility=hidden
GNU C11 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] -mthumb -march=armv6s-m -mthumb -march=armv6s-m -g -O2 -fno-builtin
prev_tzenv
LoopForever
prev_tzenv
.debug_abbrev

链接器命令行:

arm-none-eabi-gcc -std=c99 -O3 -Wall -ffunction-sections -mcpu=cortex-m0 -mthumb -mfloat-abi=soft  -Tst/stm32f0xx-32-6.ld -Wl,-Map=dtc_main.map -Wl,--gc-sections  -specs=nano.specs -o file.elf file.o startup_stm32f0xx.o system_stm32f0xx.ao syscalls.o

【问题讨论】:

  • 所以它被优化了,因为没有在你的程序中使用。
  • 是的。我想阻止这种优化。我可以添加一些代码来扭曲其中一些字节,但我想知道是否有办法直接告诉链接器我正在尝试做什么。
  • 您的编译器有一些编译指示会关闭对部分代码的优化。否则使数组易变。
  • @Fredrik 看起来编译器没有优化它,但链接器是。不确定编译器标志/编译指示会对此有所帮助。
  • 在 --gc-sections 之后尝试 -Wl,--gc-keep-exported 这应该可以防止删除全局符号。在你的情况下,这将是 'rev'

标签: c gcc makefile


【解决方案1】:

您可以使用 rev-fno-data-sections 编译文件,或者只是在某处添加对它的虚拟使用:

volatile int x = 0;
if (x)
  memcpy(NULL, rev, 1);

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多