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>
next 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: linkBe 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).