http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
--- Comment #36 from Mark Mitchell <mark at codesourcery dot com> 2010-12-11 23:54:44 UTC --- On 12/11/2010 3:48 PM, hjl.tools at gmail dot com wrote: > 1. __attribute__((init_priority(1005))) doesn't map to > .ctors.1005 section. It probably maps to .ctors.(65535-1005). There is most definitely a direct relationship. > 2. You need to check .init_array.NNNN sections on some > platforms. Not now -- because on most platforms those sections aren't used. The whole point of this PR is to consider switching to .init_array. If we do that, then, yes, you need to use those sections *and* interleave correctly with .ctors sections. >>> 2. How do you run your constructor before "foo"? >> >> Given it a higher priority. > > The highest priority is 65535. What if foo's > constructor already has 65535 priority? There is a maximum priority; you can't have a higher priority than that. But, so what? Your question is like asking "how do you make a unsigned int bigger than UINT_MAX?" In any case, this is totally irrelevant to the issue of mixing .ctors and .init_array. > That is the constructor order between A and B. We don't support > "interleaving constructor priorities" between object files. Yes, we do. We have for a very long time. This is why the linker sorts the .ctors sections.