mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
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:
parent
0c817e7c10
commit
3a83f0342e
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
1
ld/testsuite/ld-loongarch-elf/binary.ld
Normal file
1
ld/testsuite/ld-loongarch-elf/binary.ld
Normal file
@ -0,0 +1 @@
|
||||
OUTPUT_FORMAT(binary);
|
4
ld/testsuite/ld-loongarch-elf/binary.s
Normal file
4
ld/testsuite/ld-loongarch-elf/binary.s
Normal file
@ -0,0 +1,4 @@
|
||||
.text
|
||||
ret
|
||||
.data
|
||||
.4byte 0x12345678
|
@ -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-*-*"] {
|
||||
|
Loading…
Reference in New Issue
Block a user