[Bug c/96221] New: Constructor attribute priority is ignored if additional prototypes omit attribute

srk31 at srcf dot ucam.org gcc-bugzilla@gcc.gnu.org
Thu Jul 16 15:16:06 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96221

            Bug ID: 96221
           Summary: Constructor attribute priority is ignored if
                    additional prototypes omit attribute
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: srk31 at srcf dot ucam.org
  Target Milestone: ---

Created attachment 48882
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48882&action=edit
Minimal test case

I was surprised to find that my __attribute__((constructor(101))) on a function
was not giving it priority over another constructor whose attribute used a
higher number. It turns out this was owing to an additional prototype that did
not mention the function as a constructor.

This caused a really subtle initialization bug in my code, and was tough to
track down. At the least, I would expect a warning when the information is
discarded.

I haven't tried on 8.4, but didn't see any relevant changelog entries.

Note that this is not a duplicate of 87592, which is about when the priority is
specified multiple times.

$ cat test.c
// comment these for correct behaviour, i.e. 1 then 2
static void do_init1(void);
static void do_init2(void);

static void do_init2(void) __attribute__((constructor(102)));
static void do_init2(void)
{
        printf("Init 2!\n");
}

static void do_init1(void) __attribute__((constructor(101)));
static void do_init1(void)
{
        printf("Init 1!\n");
}

int main(void)
{
        return 0;
}

$ cc -save-temps    test.c   -o test
$ ./test
Init 2!
Init 1!
$ grep -B2 init_array test.s
.LFE0:
        .size   do_init2, .-do_init2
        .section        .init_array,"aw"
--
.LFE1:
        .size   do_init1, .-do_init1
        .section        .init_array

The attribute's priority argument is being discarded. It should be visible in
the section name (".init_array.0101" etc.). If the extra prototypes are
removed, the programmer-intended behaviour is restored.


More information about the Gcc-bugs mailing list