[PATCH v1 1/5] ld: fix segfault caused by untagged stub sections
Jan Beulich
jbeulich@suse.com
Mon Oct 13 15:30:28 GMT 2025
On 13.10.2025 17:22, Matthieu Longo wrote:
> On 2025-09-26 14:13, Jan Beulich wrote:
>> On 18.09.2025 17:06, Matthieu Longo wrote:
>>> --- a/bfd/bfd-in2.h
>>> +++ b/bfd/bfd-in2.h
>>> @@ -834,6 +834,12 @@ typedef struct bfd_section
>>> const char *linked_to_symbol_name;
>>> } map_head, map_tail;
>>>
>>> + /* Indicate that the section contains branch veneers. This is used when
>>> + support for non-contiguous memory regions is enabled. The veneers have
>>> + to be allocated to the same memory region as the code they are refered
>>> + by, i.e. they cannot be moved to a subsequent memory region. */
>>> + bool veneer;
>>
>> Why would you put a bool between two pointer-sized fields, thus introducing
>> yet more padding, when in fact existing padding could be used. There's a set
>> of bitfields further up from here, and you could simply add a single-bit
>> field there, for example. Generic code changes are okay with that change,
>> but arch-specific ones will need arch maintainer approval.
>
> Here is the new attribute as a flag:
>
> diff --git a/bfd/section.c b/bfd/section.c
> index 5f0cf6e71cb..f110ed77363 100644
> --- a/bfd/section.c
> +++ b/bfd/section.c
> @@ -379,6 +379,12 @@ CODE_FRAGMENT
> . when memory read flag isn't set. *}
> .#define SEC_COFF_NOREAD 0x40000000
> .
> +. {* Indicate that the section contains branch veneers. This is used when
> +. support for non-contiguous memory regions is enabled. The
> veneers have
> +. to be allocated to the same memory region as the code they are
> refered
> +. by, i.e. they cannot be moved to a subsequent memory region. *}
> +.#define SEC_VENEER 0x80000000
> +.
> . {* End of section flags. *}
> .
> . {* Some internal packed boolean fields. *}
>
>
> With the tagging of the stub section on AArch64:
>
> diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em
> index 91d58d8fe5a..b00c9460da2 100644
> --- a/ld/emultempl/aarch64elf.em
> +++ b/ld/emultempl/aarch64elf.em
> @@ -193,7 +193,7 @@ elf${ELFSIZE}_aarch64_add_stub_section (const char
> *stub_sec_name,
> lang_output_section_statement_type *os;
> struct hook_stub_info info;
>
> - flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
> + flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_VENEER
> | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
> stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
> stub_sec_name, flags);
>
> Same thing on AArch32 and PowerPC.
>
> Is this what you suggested ?
No, sorry. I said "bit field", not "section flag". I'd rather not see you
use the last available section flag. Right below where you put the new
#define is a comment "Some internal packed boolean fields" - that's where
I thought your new flag would go.
Jan
More information about the Binutils
mailing list