5

在我的系统上,当我编译某些东西(bfin-linux-uclibc-g++但这是无关紧要的)时,我会收到数百条关于编译器标志之一的警告(不在我自己的代码库中)。我想禁用它。

fde encoding in src/SpiMessageUtil.o(.eh_frame) prevents .eh_frame_hdr table being created.

这源于一个默认的 gcc 标志,该标志被移交给链接器,通过添加'-v'到编译步骤很容易检查:

COLLECT_GCC_OPTIONS=... --eh-frame-hdr ...

我想摆脱这个选项,它确实是默认定义的:

bfin-linux-uclibc-g++ -dumpspecs | grep frame-hdr
%{!static:--eh-frame-hdr}\
%{mfdpic: -m elf32bfinfd -z text} %{shared} %{pie}   \
%{static:-dn -Bstatic}   %{shared:-G -Bdynamic}   \
%{!shared: %{!static:    %{rdynamic:-export-dynamic}    \
  %{!dynamic-linker:-dynamic-linker \
     %{mglibc:%{muclibc:%e-mglibc and -muclibc used together;:%e-mglibc not supported for this target};:/lib/ld-uClibc.so.0 \
}}}\
%{static}} -init __init -fini __fini

如何覆盖此选项?我不能使用-Wl,--no-eh-frame-hdr,因为没有类似的定义。

4

2 回答 2

1

您可以动态转储 GCC 的规范,从那里删除此开关并在链接时使用它,即:

g++ -dumpspecs | sed -e 's,--eh-frame-hdr,,g' > better_specs
g++ -specs=better_specs -o target file1.o file2.o -llib1...

这将替换内联规范,同时保持原始编译器完好无损。

如果您保留自己的 Makefile,也可以通过以下方式处理:

$(TARGET): $(OBJS) | better_specs
    $(LINK.o) $(OUTPUT_OPTION) -specs=$| $^

better_specs:
    $(CXX) -dumpspecs | sed -e 's,--eh-frame-hdr,,g' > $@

这种方法也可以与配置脚本一起使用,前提是您之前生成了 better_specs,您可以只使用./configure CXX='g++ -specs=/path/to/better_specs'.

于 2016-08-30T13:29:36.143 回答
1

我刚开始将一些代码反向移植到带有 bfin 控制器的旧系统,并遇到了这些非常烦人的警告的问题——一次 1000 个。我没有找到一种方法来停用输出。

但是有两种“可行的方法”:

修复源并重建工具链:

在函数 _bfd_elf_discard_section_eh_frame 中删除在 elf-eh-frame.c 中创建输出的代码:

(*info->callbacks->einfo)
    (_("%P: fde encoding in %B(%A) prevents .eh_frame_hdr"
       " table being created.\n"), abfd, sec);

修补 ld 二进制文件

查看 ld-Binary 并直接修补二进制文件。我用 objdump 转储了数据段 (.rodata) 以找到字符串的地址。然后(在使用 objdump 创建反汇编之后)我搜索了该字符串的使用位置,并将对创建输出的函数的调用替换为两个 NoOps(0xFF 0xD3 -> 0x90 0x90)。链接器仍然创建相同的输出,但没有更多消息。

于 2017-10-12T10:03:45.463 回答