loongarch: Don't check ABI flags if no code section

Various packages (glib and gtk4 for example) produces data-only objects
using `ld -r -b binary` or `objcopy`, with no elf header flags set.  But
these files also have no code sections, so they should be compatible
with all ABIs.

bfd/
	* elfnn-loongarch.c (elfNN_loongarch_merge_private_bfd_data):
	Skip ABI checks if the input has no code sections.

Reported-by: Wu Xiaotian <yetist@gmail.com>
Suggested-by: Wang Xuerui <i@xen0n.name>
Signed-off-by: Xi Ruoyao <xry111@mengyan1223.wang>
This commit is contained in:
Xi Ruoyao 2022-04-29 01:25:20 +08:00 committed by liuzhensong
parent c54a62119a
commit 83c5f3aea9

View File

@ -389,6 +389,27 @@ elfNN_loongarch_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
if (!_bfd_elf_merge_object_attributes (ibfd, info))
return false;
/* If the input BFD is not a dynamic object and it does not contain any
non-data sections, do not account its ABI. For example, various
packages produces such data-only relocatable objects with
`ld -r -b binary` or `objcopy`, and these objects have zero e_flags.
But they are compatible with all ABIs. */
if (!(ibfd->flags & DYNAMIC))
{
asection *sec;
bool have_code_sections = false;
for (sec = ibfd->sections; sec != NULL; sec = sec->next)
if ((bfd_section_flags (sec)
& (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
== (SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS))
{
have_code_sections = true;
break;
}
if (!have_code_sections)
return true;
}
if (!elf_flags_init (obfd))
{
elf_flags_init (obfd) = true;