aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog17
-rw-r--r--bfd/elf-bfd.h8
-rw-r--r--bfd/elf32-mips.c12
-rw-r--r--bfd/elflink.c10
-rw-r--r--bfd/elfn32-mips.c12
-rw-r--r--bfd/elfxx-target.h4
-rw-r--r--binutils/ChangeLog14
-rw-r--r--binutils/testsuite/binutils-all/mips/global-local-symtab-n32.d8
-rw-r--r--binutils/testsuite/binutils-all/mips/global-local-symtab-n32t.d8
-rw-r--r--binutils/testsuite/binutils-all/mips/global-local-symtab-n64.d10
-rw-r--r--binutils/testsuite/binutils-all/mips/global-local-symtab-o32.d10
-rw-r--r--binutils/testsuite/binutils-all/mips/global-local-symtab-o32t.d10
-rw-r--r--binutils/testsuite/binutils-all/mips/mips.exp5
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/testsuite/gas/mips/global-local-symtab-n32.d6
-rw-r--r--gas/testsuite/gas/mips/global-local-symtab-n32t.d6
-rw-r--r--gas/testsuite/gas/mips/global-local-symtab-n64.d8
-rw-r--r--gas/testsuite/gas/mips/global-local-symtab-o32.d8
-rw-r--r--gas/testsuite/gas/mips/global-local-symtab-o32t.d8
-rw-r--r--gas/testsuite/gas/mips/global-local-symtab.s10
-rw-r--r--gas/testsuite/gas/mips/mips.exp6
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/testsuite/ld-mips-elf/global-local-symtab-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/global-local-symtab-n32t.d6
-rw-r--r--ld/testsuite/ld-mips-elf/global-local-symtab-n64.d8
-rw-r--r--ld/testsuite/ld-mips-elf/global-local-symtab-o32.d8
-rw-r--r--ld/testsuite/ld-mips-elf/global-local-symtab-o32t.d8
-rw-r--r--ld/testsuite/ld-mips-elf/global-local-symtab.ld8
-rw-r--r--ld/testsuite/ld-mips-elf/mips-elf.exp6
29 files changed, 250 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8e8dc99..63499ef 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,20 @@
+2020-07-29 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * elf-bfd.h (elf_backend_data): Add
+ `elf_backend_elfsym_local_is_section' member.
+ * elfxx-target.h (elf_backend_elfsym_local_is_section): New
+ macro.
+ (elfNN_bed): Add `elf_backend_elfsym_local_is_section' member.
+ * elflink.c (bfd_elf_final_link): Use it to determine whether
+ set the `.symtab' section's `sh_info' value to the index of the
+ first non-local or non-section symbol.
+ * elf32-mips.c (mips_elf32_elfsym_local_is_section): New
+ function.
+ (elf_backend_elfsym_local_is_section): New macro.
+ * elfn32-mips.c (mips_elf_n32_elfsym_local_is_section): New
+ function.
+ (elf_backend_elfsym_local_is_section): New macro.
+
2020-07-29 Alan Modra <amodra@gmail.com>
* elflink.c (bfd_elf_final_link): Don't segfault on local dynsyms
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 1576724..fbfe65a 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1402,6 +1402,14 @@ struct elf_backend_data
bfd_boolean (*elf_backend_write_section)
(bfd *, struct bfd_link_info *, asection *, bfd_byte *);
+ /* This function, if defined, returns TRUE if it is section symbols
+ only that are considered local for the purpose of partitioning the
+ symbol table into local and global symbols. This should be NULL
+ for most targets, in which case the correct thing will be done.
+ MIPS ELF, at least on the Irix 5, has special requirements. */
+ bfd_boolean (*elf_backend_elfsym_local_is_section)
+ (bfd *);
+
/* The level of IRIX compatibility we're striving for.
MIPS ELF specific function. */
irix_compat_t (*elf_backend_mips_irix_compat)
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
index a585e42..b17d516 100644
--- a/bfd/elf32-mips.c
+++ b/bfd/elf32-mips.c
@@ -63,6 +63,8 @@ static bfd_boolean mips_info_to_howto_rela
(bfd *, arelent *, Elf_Internal_Rela *);
static bfd_boolean mips_elf_sym_is_global
(bfd *, asymbol *);
+static bfd_boolean mips_elf32_elfsym_local_is_section
+ (bfd *);
static bfd_boolean mips_elf32_object_p
(bfd *);
static bfd_boolean mips_elf_is_local_label_name
@@ -2284,6 +2286,14 @@ mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
|| bfd_is_und_section (bfd_asymbol_section (sym))
|| bfd_is_com_section (bfd_asymbol_section (sym)));
}
+
+/* Likewise, return TRUE if the symbol table split overall must be
+ between section symbols and all other symbols. */
+static bfd_boolean
+mips_elf32_elfsym_local_is_section (bfd *abfd)
+{
+ return SGI_COMPAT (abfd);
+}
/* Set the right machine number for a MIPS ELF file. */
@@ -2552,6 +2562,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
#define elf_backend_ignore_discarded_relocs \
_bfd_mips_elf_ignore_discarded_relocs
#define elf_backend_write_section _bfd_mips_elf_write_section
+#define elf_backend_elfsym_local_is_section \
+ mips_elf32_elfsym_local_is_section
#define elf_backend_mips_irix_compat elf32_mips_irix_compat
#define elf_backend_mips_rtype_to_howto mips_elf32_rtype_to_howto
#define elf_backend_sort_relocs_p _bfd_mips_elf_sort_relocs_p
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 5089616..32a2d6d 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -12315,6 +12315,13 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
}
}
+ /* On some targets like Irix 5 the symbol split between local and global
+ ones recorded in the sh_info field needs to be done between section
+ and all other symbols. */
+ if (bed->elf_backend_elfsym_local_is_section
+ && bed->elf_backend_elfsym_local_is_section (abfd))
+ symtab_hdr->sh_info = bfd_get_symcount (abfd);
+
/* Allocate some memory to hold information read in from the input
files. */
if (max_contents_size != 0)
@@ -12541,7 +12548,8 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
converted to local in a version script. */
/* The sh_info field records the index of the first non local symbol. */
- symtab_hdr->sh_info = bfd_get_symcount (abfd);
+ if (!symtab_hdr->sh_info)
+ symtab_hdr->sh_info = bfd_get_symcount (abfd);
if (dynamic
&& htab->dynsym != NULL
diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
index 71242a5..16febe7 100644
--- a/bfd/elfn32-mips.c
+++ b/bfd/elfn32-mips.c
@@ -72,6 +72,8 @@ static bfd_boolean mips_info_to_howto_rela
(bfd *, arelent *, Elf_Internal_Rela *);
static bfd_boolean mips_elf_sym_is_global
(bfd *, asymbol *);
+static bfd_boolean mips_elf_n32_elfsym_local_is_section
+ (bfd *);
static bfd_boolean mips_elf_n32_object_p
(bfd *);
static bfd_boolean elf32_mips_grok_prstatus
@@ -3844,6 +3846,14 @@ mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
|| bfd_is_und_section (bfd_asymbol_section (sym))
|| bfd_is_com_section (bfd_asymbol_section (sym)));
}
+
+/* Likewise, return TRUE if the symbol table split overall must be
+ between section symbols and all other symbols. */
+static bfd_boolean
+mips_elf_n32_elfsym_local_is_section (bfd *abfd)
+{
+ return SGI_COMPAT (abfd);
+}
/* Set the right machine number for a MIPS ELF file. */
@@ -4160,6 +4170,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
#define elf_backend_ignore_discarded_relocs \
_bfd_mips_elf_ignore_discarded_relocs
#define elf_backend_write_section _bfd_mips_elf_write_section
+#define elf_backend_elfsym_local_is_section \
+ mips_elf_n32_elfsym_local_is_section
#define elf_backend_mips_irix_compat elf_n32_mips_irix_compat
#define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto
#define bfd_elf32_bfd_is_target_special_symbol \
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index c2b828b..a137c46 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -660,6 +660,9 @@
#ifndef elf_backend_write_section
#define elf_backend_write_section NULL
#endif
+#ifndef elf_backend_elfsym_local_is_section
+#define elf_backend_elfsym_local_is_section NULL
+#endif
#ifndef elf_backend_mips_irix_compat
#define elf_backend_mips_irix_compat NULL
#endif
@@ -884,6 +887,7 @@ static struct elf_backend_data elfNN_bed =
elf_backend_can_make_lsda_relative_eh_frame,
elf_backend_encode_eh_address,
elf_backend_write_section,
+ elf_backend_elfsym_local_is_section,
elf_backend_mips_irix_compat,
elf_backend_mips_rtype_to_howto,
elf_backend_ecoff_debug_swap,
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 5d32d26..a5efafc 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,17 @@
+2020-07-29 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * testsuite/binutils-all/mips/global-local-symtab-o32.d: New
+ test.
+ * testsuite/binutils-all/mips/global-local-symtab-o32t.d: New
+ test.
+ * testsuite/binutils-all/mips/global-local-symtab-n32.d: New
+ test.
+ * testsuite/binutils-all/mips/global-local-symtab-n32t.d: New
+ test.
+ * testsuite/binutils-all/mips/global-local-symtab-n64.d: New
+ test.
+ * testsuite/binutils-all/mips/mips.exp: Run the new tests.
+
2020-07-28 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/26301
diff --git a/binutils/testsuite/binutils-all/mips/global-local-symtab-n32.d b/binutils/testsuite/binutils-all/mips/global-local-symtab-n32.d
new file mode 100644
index 0000000..ef48105
--- /dev/null
+++ b/binutils/testsuite/binutils-all/mips/global-local-symtab-n32.d
@@ -0,0 +1,8 @@
+#PROG: objcopy
+#DUMPPROG: readelf
+#name: MIPS global/local symbol table split (n32)
+#as: -n32 -mno-pdr -mips3
+#objcopy: -j .data -j .symtab -j .strtab -j .shstrtab
+#readelf: -S
+#source: ../../../../gas/testsuite/gas/mips/global-local-symtab.s
+#dump: global-local-symtab-o32.d
diff --git a/binutils/testsuite/binutils-all/mips/global-local-symtab-n32t.d b/binutils/testsuite/binutils-all/mips/global-local-symtab-n32t.d
new file mode 100644
index 0000000..b44891f
--- /dev/null
+++ b/binutils/testsuite/binutils-all/mips/global-local-symtab-n32t.d
@@ -0,0 +1,8 @@
+#PROG: objcopy
+#DUMPPROG: readelf
+#name: MIPS global/local symbol table split (n32)
+#as: -n32 -mno-pdr -mips3
+#objcopy: -j .data -j .symtab -j .strtab -j .shstrtab
+#readelf: -S
+#source: ../../../../gas/testsuite/gas/mips/global-local-symtab.s
+#dump: global-local-symtab-o32t.d
diff --git a/binutils/testsuite/binutils-all/mips/global-local-symtab-n64.d b/binutils/testsuite/binutils-all/mips/global-local-symtab-n64.d
new file mode 100644
index 0000000..a170d74
--- /dev/null
+++ b/binutils/testsuite/binutils-all/mips/global-local-symtab-n64.d
@@ -0,0 +1,10 @@
+#PROG: objcopy
+#DUMPPROG: readelf
+#name: MIPS global/local symbol table split (n64)
+#as: -64 -mno-pdr -mips3
+#objcopy: -j .data -j .symtab -j .strtab -j .shstrtab
+#readelf: -SW
+#source: ../../../../gas/testsuite/gas/mips/global-local-symtab.s
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +18 +3 +3 +8
+#pass
diff --git a/binutils/testsuite/binutils-all/mips/global-local-symtab-o32.d b/binutils/testsuite/binutils-all/mips/global-local-symtab-o32.d
new file mode 100644
index 0000000..4e6307e
--- /dev/null
+++ b/binutils/testsuite/binutils-all/mips/global-local-symtab-o32.d
@@ -0,0 +1,10 @@
+#PROG: objcopy
+#DUMPPROG: readelf
+#name: MIPS global/local symbol table split (o32)
+#as: -32 -mno-pdr
+#objcopy: -j .data -j .symtab -j .strtab -j .shstrtab
+#readelf: -S
+#source: ../../../../gas/testsuite/gas/mips/global-local-symtab.s
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +10 +3 +2 +4
+#pass
diff --git a/binutils/testsuite/binutils-all/mips/global-local-symtab-o32t.d b/binutils/testsuite/binutils-all/mips/global-local-symtab-o32t.d
new file mode 100644
index 0000000..1b2847d
--- /dev/null
+++ b/binutils/testsuite/binutils-all/mips/global-local-symtab-o32t.d
@@ -0,0 +1,10 @@
+#PROG: objcopy
+#DUMPPROG: readelf
+#name: MIPS global/local symbol table split (o32)
+#as: -32 -mno-pdr
+#objcopy: -j .data -j .symtab -j .strtab -j .shstrtab
+#readelf: -S
+#source: ../../../../gas/testsuite/gas/mips/global-local-symtab.s
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +10 +3 +3 +4
+#pass
diff --git a/binutils/testsuite/binutils-all/mips/mips.exp b/binutils/testsuite/binutils-all/mips/mips.exp
index ea06ee6..eed1dd1 100644
--- a/binutils/testsuite/binutils-all/mips/mips.exp
+++ b/binutils/testsuite/binutils-all/mips/mips.exp
@@ -218,6 +218,7 @@ if {[istarget *-*-openbsd*] } {
set abi_asflags(o32) -32
set irixemul 1
}
+set tmips [expr $irixemul ? {""} : {"t"}]
run_dump_test_o32 "mips-ase-1"
run_dump_test_o32 "mips-ase-2"
@@ -247,3 +248,7 @@ run_dump_test_n64 "mips-note-2r-n64"
run_dump_test_o32 "mips-reginfo"
run_dump_test_n32 "mips-reginfo-n32"
+
+run_dump_test_o32 "global-local-symtab-o32${tmips}"
+run_dump_test_n32 "global-local-symtab-n32${tmips}"
+run_dump_test_n64 "global-local-symtab-n64"
diff --git a/gas/ChangeLog b/gas/ChangeLog
index ebc99b6..1da85af 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2020-07-29 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * testsuite/gas/mips/global-local-symtab-o32.d: New test.
+ * testsuite/gas/mips/global-local-symtab-o32t.d: New test.
+ * testsuite/gas/mips/global-local-symtab-n32.d: New test.
+ * testsuite/gas/mips/global-local-symtab-n32t.d: New test.
+ * testsuite/gas/mips/global-local-symtab-n64.d: New test.
+ * testsuite/gas/mips/global-local-symtab.s: New test source.
+ * testsuite/gas/mips/mips.exp: Run the new tests.
+
2020-07-28 H.J. Lu <hongjiu.lu@intel.com>
PR gas/26305
diff --git a/gas/testsuite/gas/mips/global-local-symtab-n32.d b/gas/testsuite/gas/mips/global-local-symtab-n32.d
new file mode 100644
index 0000000..cf7ca7e
--- /dev/null
+++ b/gas/testsuite/gas/mips/global-local-symtab-n32.d
@@ -0,0 +1,6 @@
+#DUMPPROG: readelf
+#readelf: -S
+#name: MIPS global/local symbol table split (n32)
+#as: -n32 -mno-pdr -mips3
+#source: global-local-symtab.s
+#dump: global-local-symtab-o32.d
diff --git a/gas/testsuite/gas/mips/global-local-symtab-n32t.d b/gas/testsuite/gas/mips/global-local-symtab-n32t.d
new file mode 100644
index 0000000..b3010f6
--- /dev/null
+++ b/gas/testsuite/gas/mips/global-local-symtab-n32t.d
@@ -0,0 +1,6 @@
+#DUMPPROG: readelf
+#readelf: -S
+#name: MIPS global/local symbol table split (n32)
+#as: -n32 -mno-pdr -mips3
+#source: global-local-symtab.s
+#dump: global-local-symtab-o32t.d
diff --git a/gas/testsuite/gas/mips/global-local-symtab-n64.d b/gas/testsuite/gas/mips/global-local-symtab-n64.d
new file mode 100644
index 0000000..1255ade
--- /dev/null
+++ b/gas/testsuite/gas/mips/global-local-symtab-n64.d
@@ -0,0 +1,8 @@
+#DUMPPROG: readelf
+#readelf: -SW
+#name: MIPS global/local symbol table split (n64)
+#as: -64 -mno-pdr -mips3
+#source: global-local-symtab.s
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +18 +8 +8 +8
+#pass
diff --git a/gas/testsuite/gas/mips/global-local-symtab-o32.d b/gas/testsuite/gas/mips/global-local-symtab-o32.d
new file mode 100644
index 0000000..4793794
--- /dev/null
+++ b/gas/testsuite/gas/mips/global-local-symtab-o32.d
@@ -0,0 +1,8 @@
+#DUMPPROG: readelf
+#readelf: -S
+#name: MIPS global/local symbol table split (o32)
+#as: -32 -mno-pdr
+#source: global-local-symtab.s
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +10 +8 +7 +4
+#pass
diff --git a/gas/testsuite/gas/mips/global-local-symtab-o32t.d b/gas/testsuite/gas/mips/global-local-symtab-o32t.d
new file mode 100644
index 0000000..e16fa66
--- /dev/null
+++ b/gas/testsuite/gas/mips/global-local-symtab-o32t.d
@@ -0,0 +1,8 @@
+#DUMPPROG: readelf
+#readelf: -S
+#name: MIPS global/local symbol table split (o32)
+#as: -32 -mno-pdr
+#source: global-local-symtab.s
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +10 +8 +8 +4
+#pass
diff --git a/gas/testsuite/gas/mips/global-local-symtab.s b/gas/testsuite/gas/mips/global-local-symtab.s
new file mode 100644
index 0000000..1ac85b3
--- /dev/null
+++ b/gas/testsuite/gas/mips/global-local-symtab.s
@@ -0,0 +1,10 @@
+ .data
+ .globl foo
+ .type foo, @object
+foo:
+ .dc.l 0
+ .size foo, . - foo
+ .type bar, @object
+bar:
+ .dc.l 0
+ .size bar, . - bar
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index ddbb86d..f16d1b1 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -2092,4 +2092,10 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "pr14798${imips}"
run_dump_test "insn-isa-mode"
+ run_dump_test "insn-isa-mode"
+ run_dump_test "global-local-symtab-o32${tmips}"
+ if $has_newabi {
+ run_dump_test "global-local-symtab-n32${tmips}"
+ run_dump_test "global-local-symtab-n64"
+ }
}
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 5ee1a0e..96edfb3 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,14 @@
+2020-07-29 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * testsuite/ld-mips-elf/global-local-symtab-o32.d: New test.
+ * testsuite/ld-mips-elf/global-local-symtab-o32t.d: New test.
+ * testsuite/ld-mips-elf/global-local-symtab-n32.d: New test.
+ * testsuite/ld-mips-elf/global-local-symtab-n32t.d: New test.
+ * testsuite/ld-mips-elf/global-local-symtab-n64.d: New test.
+ * testsuite/ld-mips-elf/global-local-symtab.ld: New test linker
+ script.
+ * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
+
2020-07-29 Alan Modra <amodra@gmail.com>
* ldelf.c (ldelf_before_place_orphans): Set SEC_EXCLUDE for
diff --git a/ld/testsuite/ld-mips-elf/global-local-symtab-n32.d b/ld/testsuite/ld-mips-elf/global-local-symtab-n32.d
new file mode 100644
index 0000000..619295e
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/global-local-symtab-n32.d
@@ -0,0 +1,6 @@
+#name: MIPS global/local symbol table split (n32)
+#source: ../../../gas/testsuite/gas/mips/global-local-symtab.s
+#as: -mno-pdr
+#ld: -r -T global-local-symtab.ld
+#readelf: -S
+#dump: global-local-symtab-o32.d
diff --git a/ld/testsuite/ld-mips-elf/global-local-symtab-n32t.d b/ld/testsuite/ld-mips-elf/global-local-symtab-n32t.d
new file mode 100644
index 0000000..a87c1d6
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/global-local-symtab-n32t.d
@@ -0,0 +1,6 @@
+#name: MIPS global/local symbol table split (n32)
+#source: ../../../gas/testsuite/gas/mips/global-local-symtab.s
+#as: -mno-pdr
+#ld: -r -T global-local-symtab.ld
+#readelf: -S
+#dump: global-local-symtab-o32t.d
diff --git a/ld/testsuite/ld-mips-elf/global-local-symtab-n64.d b/ld/testsuite/ld-mips-elf/global-local-symtab-n64.d
new file mode 100644
index 0000000..b77625c
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/global-local-symtab-n64.d
@@ -0,0 +1,8 @@
+#name: MIPS global/local symbol table split (n64)
+#source: ../../../gas/testsuite/gas/mips/global-local-symtab.s
+#as: -mno-pdr
+#ld: -r -T global-local-symtab.ld
+#readelf: -SW
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +18 +3 +4 +8
+#pass
diff --git a/ld/testsuite/ld-mips-elf/global-local-symtab-o32.d b/ld/testsuite/ld-mips-elf/global-local-symtab-o32.d
new file mode 100644
index 0000000..c7e1cd2
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/global-local-symtab-o32.d
@@ -0,0 +1,8 @@
+#name: MIPS global/local symbol table split (o32)
+#source: ../../../gas/testsuite/gas/mips/global-local-symtab.s
+#as: -mno-pdr
+#ld: -r -T global-local-symtab.ld
+#readelf: -S
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +10 +3 +2 +4
+#pass
diff --git a/ld/testsuite/ld-mips-elf/global-local-symtab-o32t.d b/ld/testsuite/ld-mips-elf/global-local-symtab-o32t.d
new file mode 100644
index 0000000..612d557
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/global-local-symtab-o32t.d
@@ -0,0 +1,8 @@
+#name: MIPS global/local symbol table split (o32)
+#source: ../../../gas/testsuite/gas/mips/global-local-symtab.s
+#as: -mno-pdr
+#ld: -r -T global-local-symtab.ld
+#readelf: -S
+#...
+ *\[ *[0-9]+\] +\.symtab +SYMTAB +[0-9a-f]+ +[0-9a-f]+ +[0-9a-f]+ +10 +3 +4 +4
+#pass
diff --git a/ld/testsuite/ld-mips-elf/global-local-symtab.ld b/ld/testsuite/ld-mips-elf/global-local-symtab.ld
new file mode 100644
index 0000000..57ea4de
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/global-local-symtab.ld
@@ -0,0 +1,8 @@
+SECTIONS
+{
+ .data : { *(.data) }
+ .symtab : { *(.symtab) }
+ .strtab : { *(.strtab) }
+ .shstrtab : { *(.shstrtab) }
+ /DISCARD/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index e98429c..4b257c3 100644
--- a/ld/testsuite/ld-mips-elf/mips-elf.exp
+++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
@@ -248,6 +248,7 @@ if {[istarget *-*-openbsd*] } {
set abi_asflags(o32) -32
set irixemul 1
}
+set tmips [expr $irixemul ? {""} : {"t"}]
if { $linux_gnu } {
run_ld_link_tests [list \
@@ -1657,3 +1658,8 @@ run_dump_test_n64 "pic-reloc-7" [list [list name (microMIPS)] \
[list as "-mmicromips"]]
run_dump_test_o32 "reloc-pcrel-r6"
+
+# Global/local symbol table split tests.
+run_dump_test_o32 "global-local-symtab-o32${tmips}"
+run_dump_test_n32 "global-local-symtab-n32${tmips}"
+run_dump_test_n64 "global-local-symtab-n64"