public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "itirg1 at optusnet dot com.au" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/99843] New: Making a function a friend of a class will hide function constructor priority if has constructor(n) attribute
Date: Wed, 31 Mar 2021 02:20:35 +0000	[thread overview]
Message-ID: <bug-99843-4@http.gcc.gnu.org/bugzilla/> (raw)

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

            Bug ID: 99843
           Summary: Making a function a friend of a class will hide
                    function constructor priority if has constructor(n)
                    attribute
           Product: gcc
           Version: 9.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: itirg1 at optusnet dot com.au
  Target Milestone: ---

When declaring a function a friend of a class and that function uses the
__attribute__((constructor(priority))) attribute, the priority is lost. I have
only tested this on the arm-none-eabi-g++ on windows.

In the code below I made a quick demo of the problem, all of the initialisation
functions correctly have a section called .init_array.(5 digit priority number)
containing a pointer to the function except for the function that was made a
friend which is placed in .init_array which as a result the linker script will
place after the numbered ones.

F:\Test>arm-none-eabi-g++ --version
arm-none-eabi-g++ (GNU Arm Embedded Toolchain 9-2020-q3-update) 9.3.1 20200408
(release)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

F:\Test>cat testinit.cpp
// Initialization order test

void Init101(void) __attribute__((constructor(101)));
void Init101(void)
{
    while(1);
}

static void Init102(void) __attribute__((constructor(102)));
static void Init102(void)
{
    while(1);
}

namespace Something
{

void Init103(void) __attribute__((constructor(103)));
void Init103(void)
{
    while(1);
}

static void Init104(void) __attribute__((constructor(104)));
static void Init104(void)
{
    while(1);
}

class SomeClass
{
    friend void Init105(void);

    private:
        int     foo;
    public:
        int     bar;
};

SomeClass * AClassPtr = nullptr;

void Init105(void) __attribute__((constructor(105)));
void Init105(void)
{
    if (AClassPtr == nullptr)
    {
        AClassPtr = new SomeClass;
    }
    AClassPtr->foo = 219;
}

void Init106(void) __attribute__((constructor(106)));
void Init106(void)
{
    while(1);
}

}

F:\Test>arm-none-eabi-g++ -mcpu=cortex-m0 -c -fno-exceptions testinit.cpp

F:\Test>arm-none-eabi-objdump -h -r -t testinit.o

testinit.o:     file format elf32-littlearm

Sections:
Idx Name              Size      VMA       LMA       File off  Algn
  0 .text             0000004c  00000000  00000000  00000034  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data             00000000  00000000  00000000  00000080  2**0
                      CONTENTS, ALLOC, LOAD, DATA
  2 .bss              00000004  00000000  00000000  00000080  2**2
                      ALLOC
  3 .init_array.00101 00000004  00000000  00000000  00000080  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  4 .init_array.00102 00000004  00000000  00000000  00000084  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  5 .init_array.00103 00000004  00000000  00000000  00000088  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  6 .init_array.00104 00000004  00000000  00000000  0000008c  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  7 .init_array       00000004  00000000  00000000  00000090  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  8 .init_array.00106 00000004  00000000  00000000  00000094  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  9 .comment          0000004d  00000000  00000000  00000098  2**0
                      CONTENTS, READONLY
 10 .ARM.attributes 0000002c  00000000  00000000  000000e5  2**0
                      CONTENTS, READONLY

SYMBOL TABLE:
00000000 l    df *ABS*                  00000000 testinit.cpp
00000000 l    d  .text                  00000000 .text
00000000 l    d  .data                  00000000 .data
00000000 l    d  .bss                   00000000 .bss
00000000 l    d  .init_array.00101      00000000 .init_array.00101
00000006 l     F .text                  00000006 _ZL7Init102v
00000000 l    d  .init_array.00102      00000000 .init_array.00102
00000000 l    d  .init_array.00103      00000000 .init_array.00103
00000012 l     F .text                  00000006 _ZN9SomethingL7Init104Ev
00000000 l    d  .init_array.00104      00000000 .init_array.00104
00000000 l    d  .init_array            00000000 .init_array
00000000 l    d  .init_array.00106      00000000 .init_array.00106
00000000 l    d  .comment               00000000 .comment
00000000 l    d  .ARM.attributes        00000000 .ARM.attributes
00000000 g     F .text                  00000006 _Z7Init101v
0000000c g     F .text                  00000006 _ZN9Something7Init103Ev
00000000 g     O .bss                   00000004 _ZN9Something9AClassPtrE
00000018 g     F .text                  0000002c _ZN9Something7Init105Ev
00000000         *UND*                  00000000 _Znwj
00000044 g     F .text                  00000006 _ZN9Something7Init106Ev

RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
00000026 R_ARM_THM_CALL    _Znwj
00000040 R_ARM_ABS32       _ZN9Something9AClassPtrE


RELOCATION RECORDS FOR [.init_array.00101]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _Z7Init101v


RELOCATION RECORDS FOR [.init_array.00102]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZL7Init102v


RELOCATION RECORDS FOR [.init_array.00103]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9Something7Init103Ev


RELOCATION RECORDS FOR [.init_array.00104]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9SomethingL7Init104Ev


RELOCATION RECORDS FOR [.init_array]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9Something7Init105Ev


RELOCATION RECORDS FOR [.init_array.00106]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9Something7Init106Ev

F:\Test>

Adding the __attribute__((constructor(105))) into the friend statement as well
fixes the problem and the correct output is then generated however in the first
case I think at the very least a warning should have been generated or ideally
keeping the priority instead of quietly removing it.

Changing the line with the friend statement to

    friend void Init105(void) __attribute__((constructor(105)));

generated the correct sections

F:\Test>arm-none-eabi-objdump -h -r -t testinit.o

testinit.o:     file format elf32-littlearm

Sections:
Idx Name              Size      VMA       LMA       File off  Algn
  0 .text             0000004c  00000000  00000000  00000034  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data             00000000  00000000  00000000  00000080  2**0
                      CONTENTS, ALLOC, LOAD, DATA
  2 .bss              00000004  00000000  00000000  00000080  2**2
                      ALLOC
  3 .ARM.extab        00000000  00000000  00000000  00000080  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .ARM.exidx        00000030  00000000  00000000  00000080  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
  5 .init_array.00101 00000004  00000000  00000000  000000b0  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  6 .init_array.00102 00000004  00000000  00000000  000000b4  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  7 .init_array.00103 00000004  00000000  00000000  000000b8  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  8 .init_array.00104 00000004  00000000  00000000  000000bc  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
  9 .init_array.00105 00000004  00000000  00000000  000000c0  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
 10 .init_array.00106 00000004  00000000  00000000  000000c4  2**2
                      CONTENTS, ALLOC, LOAD, RELOC, DATA
 11 .comment          0000004d  00000000  00000000  000000c8  2**0
                      CONTENTS, READONLY
 12 .ARM.attributes   0000002c  00000000  00000000  00000115  2**0
                      CONTENTS, READONLY

SYMBOL TABLE:
00000000 l    df *ABS*              00000000 testinit.cpp
00000000 l    d  .text              00000000 .text
00000000 l    d  .data              00000000 .data
00000000 l    d  .bss               00000000 .bss
00000000 l    d  .ARM.extab         00000000 .ARM.extab
00000000 l    d  .ARM.exidx         00000000 .ARM.exidx
00000000 l    d  .init_array.00101  00000000 .init_array.00101
00000006 l     F .text              00000006 _ZL7Init102v
00000000 l    d  .init_array.00102  00000000 .init_array.00102
00000000 l    d  .init_array.00103  00000000 .init_array.00103
00000012 l     F .text              00000006 _ZN9SomethingL7Init104Ev
00000000 l    d  .init_array.00104  00000000 .init_array.00104
00000000 l    d  .init_array.00105  00000000 .init_array.00105
00000000 l    d  .init_array.00106  00000000 .init_array.00106
00000000 l    d  .comment           00000000 .comment
00000000 l    d  .ARM.attributes    00000000 .ARM.attributes
00000000 g     F .text              00000006 _Z7Init101v
0000000c g     F .text              00000006 _ZN9Something7Init103Ev
00000018 g     F .text              0000002c _ZN9Something7Init105Ev
00000000         *UND*              00000000 _Znwj
00000000 g     O .bss               00000004 _ZN9Something9AClassPtrE
00000000         *UND*              00000000 __aeabi_unwind_cpp_pr0
00000044 g     F .text              00000006 _ZN9Something7Init106Ev


RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
00000026 R_ARM_THM_CALL    _Znwj
00000040 R_ARM_ABS32       _ZN9Something9AClassPtrE


RELOCATION RECORDS FOR [.ARM.exidx]:
OFFSET   TYPE              VALUE
00000000 R_ARM_PREL31      .text
00000008 R_ARM_PREL31      .text
00000010 R_ARM_PREL31      .text
00000018 R_ARM_PREL31      .text
00000020 R_ARM_PREL31      .text
00000020 R_ARM_NONE        __aeabi_unwind_cpp_pr0
00000028 R_ARM_PREL31      .text


RELOCATION RECORDS FOR [.init_array.00101]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _Z7Init101v


RELOCATION RECORDS FOR [.init_array.00102]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZL7Init102v


RELOCATION RECORDS FOR [.init_array.00103]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9Something7Init103Ev


RELOCATION RECORDS FOR [.init_array.00104]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9SomethingL7Init104Ev


RELOCATION RECORDS FOR [.init_array.00105]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9Something7Init105Ev


RELOCATION RECORDS FOR [.init_array.00106]:
OFFSET   TYPE              VALUE
00000000 R_ARM_TARGET1     _ZN9Something7Init106Ev

F:\Test>

             reply	other threads:[~2021-03-31  2:20 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-31  2:20 itirg1 at optusnet dot com.au [this message]
2021-03-31  8:15 ` [Bug c++/99843] " rguenth at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-99843-4@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).