Hi

I was wondering why the vx_crtbegin.o file had a .init_array section and
not a .init_array.00101, when the function is defined with
__attribute__((constructor (101))) (see libgcc/config/vxcrtstuff.c).

After a lot of digging, including making sure that EH_CTOR_ATTRIBUTE
actually gets defined as I expect and adding -frecord-gcc-switches to
the build to see if any of those made ctor priorities ignored, it turns
out that the problem is the declarations preceding the definitions. This
can easily be reproduced by

#define ac(prio) __attribute__((constructor(prio)))

unsigned x = 987;

static void f101(void);
void f102(void);

static void ac(101) f101(void) { x += 101; }
void ac(102) f102(void) { x *= 102; }

static void ac(103) f103(void) { x -= 103; }
void ac(104) f104(void) { x /= 104; }

This results in a .init_array section with two pointers, plus the
expected .init_array.00103 and .init_array.00104 with one each.

This is rather unexpected, especially since the attribute is not
entirely ignored, just the priority part.

Rasmus

Reply via email to