[ros-dev] __attribute__((weak)) - in mingw
Danny Smith
dannysmith at clear.net.nz
Wed Feb 16 08:39:29 CET 2005
Boaz Harrosh wrote:
>> Danny Smith wrote:
>>
>>> Boaz Harrosh wrote:
>>>
>>>
>>>> [Q] I'm (well ATL is) using __attribute__((weak)) (translated from
>>>> __declspec( selectany) ) for instantiation of members and variables in
>>>> headers. I had no problem with it On GCC in Linux (gcc 3.2.2). On MinGW
>>>>
>>>>
>>>
>>> IMAGE_COMDAT_SELECT_ANY is not quite same as PECOFF version of "weak" , but
>>> AFAICT is equivalent to the GCC section flag ".linkonce discard". I don't
>>> think there is a way for the user to specify that for data using an
>>> attribute, but it could be done with asm statements.
>>>
>>> .weak directive is partially supported in current binutils CVS.
>>> __attribute__((weak)) is not supported by GCC-3.4.x but will be in the next
>>> major GCC release (4.0.0).
>>>
Sorry, that was unclear. I should have qualified with "on windows
targets"
>>> The semantics of weak for PECOFF differ from that on Linux.See the PECOFF60
>>> specs (Microsoft Portable Executable and Common Object File Format
>>> Specification) section on weak externals
>>>
>>> Danny
>>>
>>>
>> (binutils at sources dot redhat dot com please also cc me as I'm not on
>> the list)
>>
>> Attached is a proof (See fooInt.h) that gcc (gcc version 3.2 (mingw
>> special 20020817-1)) has support for weak symbols. Just not with the
>> regular syntax.
>> But when templates are used duplicate symbols are merged by the linker.
>>
>> What would be the assembler magic to cram into the __WEAK__ definition
>> that would make this project link?
>>
I am currently testing a patch to GCC to add an __attribute__ ((selectany)) that
would work the way it is discribed in MS docs and in the spec of
IMAGE_COMDAT_SELECT_ANY in PECOFF doc. Basically it puts the symbol into its
own section with ".linkonce discard" charcteristics.
__declspec (selectany) int foo = 1;
becomes:
.globl _foo
.section .data$foo,"w"
.linkonce discard
.align 4
_foo:
.long 1
So far the only problem I've seen is that, although it works for global objects
with non-trivial constructors
eg:
struct X {
static int s;
int m;
X(int _i) : m(_i) {
m++;
}
};
__declspec(selectany) int X::s = -1; // OK
__declspec(selectany) X x(1); // This is OK but app will be bloated with
// duplicate initialization code.
.
I haven't figured out how to get rid of the duplicated inititialization code
I will submit the patch for comment once GCC trunk branches.
Danny
>> Free Life
>> Boaz
>>
>
>
More information about the Ros-dev
mailing list