内存部分处理错误

时间:2010-04-16 05:45:10

标签: c++ assembly linker gnu

我收到链接时错误:

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中解释了这个汇编代码的含义。

4 个答案:

答案 0 :(得分:1)

非常长镜头,但是部分.ctors是在链接器脚本中定义的吗? ld iirc有一个详细的选项来显示链接器脚本。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会尽力检查__SECTION_FLAGS的值,以确保它确实包含ax或aw。我还确定__COFF__未定义且__ELF__是。{1}}。如果不这样做,可能是时候抓住(可能)编译器/链接器的先前版本或未来版本,看看是否能解决您的问题。也许您可以将代码编译为C ++,并以某种方式让编译器/链接器/链接scritps执行它们应该执行的操作? Dunno完全,但这是我要开始的地方。

答案 3 :(得分:0)

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