【问题标题】:Memory section handling error内存部分处理错误
【发布时间】:2011-02-08 16:51:41
【问题描述】:

我收到链接时间错误:

WARNING: /home/gulevich/development/camac-fedorov/camac/linux/k0607-lsi6/camac-k0607-lsi6.o (.ctors): unexpected non-allocatable section.
Did you forget to use "ax"/"aw" in a .S file?
Note that for example <linux/init.h> contains
section definitions for use in .S files.

导致错误的代码(C 源代码中的汇编):

# if   defined(__ELF__)
#  define __SECTION_FLAGS ", \"aw\" , @progbits"
 /* writable flag needed for ld ".[cd]tors" sections bug workaround) */
# elif defined(__COFF__)
#  define __SECTION_FLAGS ", \"dr\""
 /* untested, may be writable flag needed */
# endif


asm
(
 ".section .ctors" __SECTION_FLAGS "\n"
 ".globl __ctors_begin__\n"
 "__ctors_begin__:\n"
 ".previous\n"
);

有没有办法解决这个问题?这个想法是在某个内存部分的开头放置一个变量__ctors_begin__。此代码是遗留代码,使用不同的构建系统和较旧的编译器可以正常工作。

an answer to my previous question 中解释的这个汇编代码的含义。

【问题讨论】:

  • 你使用的是什么 C 编译器?
  • 作为补充说明,您发布的确切代码在 64 位 ubuntu 上的 GCC 4.4.1 中编译得很好
  • 这是链接时错误,而不是编译时错误。以下是版本信息:链接器:GNU ld (GNU Binutils for Debian) 2.20.1-system.20100303;编译器:gcc (Debian 4.4.2-9) 4.4.3 20100108(预发行版)。

标签: c++ assembly linker gnu


【解决方案1】:

很长的镜头,但 .ctors 部分是否像您在链接器脚本中定义的那样? ld iirc 有一个详细的选项来显示链接描述文件。

【讨论】:

    【解决方案2】:

    远射: 也许您的链接器期望 ELF 格式(而不是 COFF),并且由于某种原因 __ELF__ 未定义?您是否检查过此特定构建的预处理器输出?

    【讨论】:

      【解决方案3】:

      我会仔细检查__SECTION_FLAGS 的值,以确保它确实包含 ax 或 aw。我还要确定 __COFF__ 没有定义,而 __ELF__ 是。如果做不到这一点,可能是时候获取(可能)编译器/链接器的先前或未来版本,看看是否能解决您的问题。也许您可以将您的代码编译为 C++ 并以某种方式让编译器/链接器/链接脚本执行它们应该执行的操作?完全不知道,但这就是我要开始的地方。

      【讨论】:

        【解决方案4】:

        部分工作正常。所以我会忽略这个警告。

        【讨论】:

          猜你喜欢
          • 2023-04-10
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 1970-01-01
          • 2018-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多