2010-04-16 48 views
8

我得到一个链接时错误:内存部分处理错误

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

+0

您使用的是哪种C编译器? – bdonlan 2010-04-18 06:11:33

+0

作为补充说明,您发布的确切代码在64位ubuntu上在GCC 4.4.1中编译得很好 – bdonlan 2010-04-18 06:13:06

+1

这是链接时间错误,而不是编译时间错误。 以下是版本信息: 链接器:GNU ld(适用于Debian的GNU Binutils)2.20.1-system.20100303; 编译器:gcc(Debian 4.4.2-9)4.4.3 20100108(预发布)。 – Basilevs 2010-04-18 08:15:40

回答

0

远射: 也许你的链接器期待ELF格式(而不是COFF),并且出于某种原因__ELF__未定义?你是否检查过这个特定版本的预处理器输出?

0

我会推荐检查__SECTION_FLAGS的值,以确定它确实包含ax或aw。我也确定__COFF__没有被定义,并且__ELF__是。如果不这样做,可能是时候抢(可能)编译器/链接器的以前或未来版本,看看是否可以解决您的问题。也许你可以将你的代码编译为C++,并以某种方式让编译器/链接器/链接分页执行他们应该做的事情?完全不知道,但这是我开始的地方。

1

非常长的镜头,但是该部分.ctors的定义就像你想要的链接脚本? ld iirc有一个详细的选项来显示链接器脚本。

0

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