LoongArch: Add support for OUTPUT_FORMAT("binary")

In binary output format, loongarch_elf_hash_table return NULL and result
in segment fault.

When ld output binary file, it seems that elf related functions should
not be called. But loongarch_elf_relax_section be called and
loongarch_elf_hash_table cause segment fault.

Just redefined loongarch_elf_hash_table and always return
link_info->hash.

The tests of binutils, glibc and gcc is ok.

0  loongarch_elf_relax_section ()
1  0x000055555557ab28 in lang_size_sections_1 ()
2  0x000055555557a16c in lang_size_sections_1 ()
3  0x000055555557b0a8 in one_lang_size_sections_pass ()
4  0x000055555557b478 in lang_size_sections ()
5  0x000055555557e65c in lang_relax_sections ()
6  0x000055555559f9c8 in ldelf_map_segments ()
7  0x000055555559783c in gldelf64loongarch_after_allocation ()
8  0x000055555558dac0 in ldemul_after_allocation ()
9  0x000055555557f6c0 in lang_process ()
10 0x0000555555585314 in main ()
This commit is contained in:
mengqinggang 2024-06-28 14:24:19 +08:00 committed by liuzhensong
parent 0c817e7c10
commit 3a83f0342e
5 changed files with 18 additions and 19 deletions

View File

@ -157,9 +157,7 @@ loongarch_elf_new_section_hook (bfd *abfd, asection *sec)
/* Get the LoongArch ELF linker hash table from a link_info structure. */
#define loongarch_elf_hash_table(p) \
(elf_hash_table_id (elf_hash_table (p)) == LARCH_ELF_DATA \
? ((struct loongarch_elf_link_hash_table *) ((p)->hash)) \
: NULL)
((struct loongarch_elf_link_hash_table *) ((p)->hash)) \
#define MINUS_ONE ((bfd_vma) 0 - 1)

View File

@ -102,23 +102,7 @@ gld${EMULATION_NAME}_after_allocation (void)
ldelf_map_segments (need_layout);
}
/* This is a convenient point to tell BFD about target specific flags.
After the output has been created, but before inputs are read. */
static void
larch_create_output_section_statements (void)
{
/* See PR 22920 for an example of why this is necessary. */
if (strstr (bfd_get_target (link_info.output_bfd), "loong") == NULL)
{
einfo (_("%F%P: error: cannot change output format"
" whilst linking %s binaries\n"), "LoongArch");
return;
}
}
EOF
LDEMUL_BEFORE_ALLOCATION=larch_elf_before_allocation
LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=larch_create_output_section_statements

View File

@ -0,0 +1 @@
OUTPUT_FORMAT(binary);

View File

@ -0,0 +1,4 @@
.text
ret
.data
.4byte 0x12345678

View File

@ -118,6 +118,18 @@ if [istarget "loongarch64-*-*"] {
"abi1_max_imm" \
] \
]
run_ld_link_tests \
[list \
[list \
"binary output format" \
"-T binary.ld" "" \
"" \
{binary.s} \
{} \
"a.binary" \
] \
]
}
if [istarget "loongarch64-*-*"] {