aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormengqinggang <mengqinggang@loongson.cn>2024-06-28 14:24:19 +0800
committerliuzhensong <liuzhensong@loongson.cn>2024-08-05 17:38:49 +0800
commit3a83f0342e545a638aba06f27bba76938ef251ab (patch)
tree3294c44e3e3c412d5521271ab5893f88eb83e009
parent0c817e7c1058de7efbb47f253d7df9278587dead (diff)
downloadgdb-3a83f0342e545a638aba06f27bba76938ef251ab.zip
gdb-3a83f0342e545a638aba06f27bba76938ef251ab.tar.gz
gdb-3a83f0342e545a638aba06f27bba76938ef251ab.tar.bz2
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 ()
-rw-r--r--bfd/elfnn-loongarch.c4
-rw-r--r--ld/emultempl/loongarchelf.em16
-rw-r--r--ld/testsuite/ld-loongarch-elf/binary.ld1
-rw-r--r--ld/testsuite/ld-loongarch-elf/binary.s4
-rw-r--r--ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp12
5 files changed, 18 insertions, 19 deletions
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index db6d419..71fa8fa 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -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)
diff --git a/ld/emultempl/loongarchelf.em b/ld/emultempl/loongarchelf.em
index 2da4058..8a1a898 100644
--- a/ld/emultempl/loongarchelf.em
+++ b/ld/emultempl/loongarchelf.em
@@ -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
diff --git a/ld/testsuite/ld-loongarch-elf/binary.ld b/ld/testsuite/ld-loongarch-elf/binary.ld
new file mode 100644
index 0000000..73cd4f2
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/binary.ld
@@ -0,0 +1 @@
+OUTPUT_FORMAT(binary);
diff --git a/ld/testsuite/ld-loongarch-elf/binary.s b/ld/testsuite/ld-loongarch-elf/binary.s
new file mode 100644
index 0000000..b0aeb62
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/binary.s
@@ -0,0 +1,4 @@
+.text
+ ret
+.data
+ .4byte 0x12345678
diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
index fb34eeb..16d89cd 100644
--- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
+++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
@@ -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-*-*"] {