diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2013-10-13 10:03:22 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2013-10-13 10:03:22 +0000 |
commit | c5d6fa4495dd20cc44698346f102fd7702fd601d (patch) | |
tree | 8143608bc9d5fa9672f935421ad9a3b302e41c01 | |
parent | 3fcec3ee7795b07b20b3e02df70c9c326abfd81d (diff) | |
download | gdb-c5d6fa4495dd20cc44698346f102fd7702fd601d.zip gdb-c5d6fa4495dd20cc44698346f102fd7702fd601d.tar.gz gdb-c5d6fa4495dd20cc44698346f102fd7702fd601d.tar.bz2 |
bfd/
* elfxx-mips.c (mips_use_local_got_p): New function.
(mips_elf_count_got_symbols, mips_elf_calculate_relocation): Use it.
(_bfd_mips_elf_check_relocs): Set pointer_equality_needed for
GOT and absolute references.
ld/testsuite/
* ld-mips-elf/pic-and-nonpic-6-n32.ad,
ld-mips-elf/pic-and-nonpic-6-n32.dd,
ld-mips-elf/pic-and-nonpic-6-n32.gd,
ld-mips-elf/pic-and-nonpic-6-n32.nd,
ld-mips-elf/pic-and-nonpic-6-n32.rd,
ld-mips-elf/pic-and-nonpic-6-n64.ad,
ld-mips-elf/pic-and-nonpic-6-n64.dd,
ld-mips-elf/pic-and-nonpic-6-n64.gd,
ld-mips-elf/pic-and-nonpic-6-n64.nd,
ld-mips-elf/pic-and-nonpic-6-n64.rd,
ld-mips-elf/pic-and-nonpic-6-o32.ad,
ld-mips-elf/pic-and-nonpic-6-o32.dd,
ld-mips-elf/pic-and-nonpic-6-o32.gd,
ld-mips-elf/pic-and-nonpic-6-o32.nd,
ld-mips-elf/pic-and-nonpic-6-o32.rd: Fix symbol value of extf4.
No longer expect extf3, extf4 and extd2 to be in the global GOT.
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 164 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 19 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.ad | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.dd | 26 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.gd | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.nd | 39 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.rd | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.ad | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.dd | 28 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.gd | 41 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.nd | 37 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.rd | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.ad | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.dd | 26 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.gd | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.nd | 39 | ||||
-rw-r--r-- | ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.rd | 4 |
18 files changed, 302 insertions, 184 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e51180d..f7cc20f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2013-10-13 Richard Sandiford <rdsandiford@googlemail.com> + + * elfxx-mips.c (mips_use_local_got_p): New function. + (mips_elf_count_got_symbols, mips_elf_calculate_relocation): Use it. + (_bfd_mips_elf_check_relocs): Set pointer_equality_needed for + GOT and absolute references. + 2013-10-09 Roland McGrath <mcgrathr@google.com> * elf64-alpha.c (elf64_alpha_relax_tls_get_addr): Cast switch diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index d7498e1..b443876 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -4299,6 +4299,36 @@ mips_elf_resolve_final_got_entries (struct bfd_link_info *info, return TRUE; } +/* Return true if a GOT entry for H should live in the local rather than + global GOT area. */ + +static bfd_boolean +mips_use_local_got_p (struct bfd_link_info *info, + struct mips_elf_link_hash_entry *h) +{ + /* Symbols that aren't in the dynamic symbol table must live in the + local GOT. This includes symbols that are completely undefined + and which therefore don't bind locally. We'll report undefined + symbols later if appropriate. */ + if (h->root.dynindx == -1) + return TRUE; + + /* Symbols that bind locally can (and in the case of forced-local + symbols, must) live in the local GOT. */ + if (h->got_only_for_calls + ? SYMBOL_CALLS_LOCAL (info, &h->root) + : SYMBOL_REFERENCES_LOCAL (info, &h->root)) + return TRUE; + + /* If this is an executable that must provide a definition of the symbol, + either though PLTs or copy relocations, then that address should go in + the local rather than global GOT. */ + if (info->executable && h->has_static_relocs) + return TRUE; + + return FALSE; +} + /* A mips_elf_link_hash_traverse callback for which DATA points to the link_info structure. Decide whether the hash entry needs an entry in the global part of the primary GOT, setting global_got_area accordingly. @@ -4318,18 +4348,8 @@ mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data) if (h->global_got_area != GGA_NONE) { /* Make a final decision about whether the symbol belongs in the - local or global GOT. Symbols that bind locally can (and in the - case of forced-local symbols, must) live in the local GOT. - Those that are aren't in the dynamic symbol table must also - live in the local GOT. - - Note that the former condition does not always imply the - latter: symbols do not bind locally if they are completely - undefined. We'll report undefined symbols later if appropriate. */ - if (h->root.dynindx == -1 - || (h->got_only_for_calls - ? SYMBOL_CALLS_LOCAL (info, &h->root) - : SYMBOL_REFERENCES_LOCAL (info, &h->root))) + local or global GOT. */ + if (mips_use_local_got_p (info, h)) /* The symbol belongs in the local GOT. We no longer need this entry if it was only used for relocations; those relocations will be against the null or section symbol instead of H. */ @@ -5468,10 +5488,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd, && (target_is_16_bit_code_p || target_is_micromips_code_p)))); - local_p = (h == NULL - || (h->got_only_for_calls - ? SYMBOL_CALLS_LOCAL (info, &h->root) - : SYMBOL_REFERENCES_LOCAL (info, &h->root))); + local_p = (h == NULL || mips_use_local_got_p (info, h)); gp0 = _bfd_get_gp_value (input_bfd); gp = _bfd_get_gp_value (abfd); @@ -7955,6 +7972,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, unsigned int r_type; struct elf_link_hash_entry *h; bfd_boolean can_make_dynamic_p; + bfd_boolean call_reloc_p; + bfd_boolean constrain_symbol_p; r_symndx = ELF_R_SYM (abfd, rel->r_info); r_type = ELF_R_TYPE (abfd, rel->r_info); @@ -7987,12 +8006,30 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this relocation into a dynamic one. */ can_make_dynamic_p = FALSE; + + /* Set CALL_RELOC_P to true if the relocation is for a call, + and if pointer equality therefore doesn't matter. */ + call_reloc_p = FALSE; + + /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation + into account when deciding how to define the symbol. + Relocations in nonallocatable sections such as .pdr and + .debug* should have no effect. */ + constrain_symbol_p = ((sec->flags & SEC_ALLOC) != 0); + switch (r_type) { - case R_MIPS_GOT16: case R_MIPS_CALL16: case R_MIPS_CALL_HI16: case R_MIPS_CALL_LO16: + case R_MIPS16_CALL16: + case R_MICROMIPS_CALL16: + case R_MICROMIPS_CALL_HI16: + case R_MICROMIPS_CALL_LO16: + call_reloc_p = TRUE; + /* Fall through. */ + + case R_MIPS_GOT16: case R_MIPS_GOT_HI16: case R_MIPS_GOT_LO16: case R_MIPS_GOT_PAGE: @@ -8002,14 +8039,10 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_MIPS_TLS_GD: case R_MIPS_TLS_LDM: case R_MIPS16_GOT16: - case R_MIPS16_CALL16: case R_MIPS16_TLS_GOTTPREL: case R_MIPS16_TLS_GD: case R_MIPS16_TLS_LDM: case R_MICROMIPS_GOT16: - case R_MICROMIPS_CALL16: - case R_MICROMIPS_CALL_HI16: - case R_MICROMIPS_CALL_LO16: case R_MICROMIPS_GOT_HI16: case R_MICROMIPS_GOT_LO16: case R_MICROMIPS_GOT_PAGE: @@ -8030,12 +8063,27 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, bfd_set_error (bfd_error_bad_value); return FALSE; } + can_make_dynamic_p = TRUE; break; - /* This is just a hint; it can safely be ignored. Don't set - has_static_relocs for the corresponding symbol. */ + case R_MIPS_NONE: case R_MIPS_JALR: case R_MICROMIPS_JALR: + /* These relocations have empty fields and are purely there to + provide link information. The symbol value doesn't matter. */ + constrain_symbol_p = FALSE; + break; + + case R_MIPS_GPREL16: + case R_MIPS_GPREL32: + case R_MIPS16_GPREL: + case R_MICROMIPS_GPREL16: + /* GP-relative relocations always resolve to a definition in a + regular input file, ignoring the one-definition rule. This is + important for the GP setup sequence in NewABI code, which + always resolves to a local function even if other relocations + against the symbol wouldn't. */ + constrain_symbol_p = FALSE; break; case R_MIPS_32: @@ -8062,35 +8110,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, can_make_dynamic_p = TRUE; if (dynobj == NULL) elf_hash_table (info)->dynobj = dynobj = abfd; - break; } - /* For sections that are not SEC_ALLOC a copy reloc would be - output if possible (implying questionable semantics for - read-only data objects) or otherwise the final link would - fail as ld.so will not process them and could not therefore - handle any outstanding dynamic relocations. - - For such sections that are also SEC_DEBUGGING, we can avoid - these problems by simply ignoring any relocs as these - sections have a predefined use and we know it is safe to do - so. - - This is needed in cases such as a global symbol definition - in a shared library causing a common symbol from an object - file to be converted to an undefined reference. If that - happens, then all the relocations against this symbol from - SEC_DEBUGGING sections in the object file will resolve to - nil. */ - if ((sec->flags & SEC_DEBUGGING) != 0) - break; - /* Fall through. */ - - default: - /* Most static relocations require pointer equality, except - for branches. */ - if (h) - h->pointer_equality_needed = TRUE; - /* Fall through. */ + break; case R_MIPS_26: case R_MIPS_PC16: @@ -8100,13 +8121,28 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_MICROMIPS_PC10_S1: case R_MICROMIPS_PC16_S1: case R_MICROMIPS_PC23_S2: - if (h) - ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = TRUE; + call_reloc_p = TRUE; break; } if (h) { + if (constrain_symbol_p) + { + if (!can_make_dynamic_p) + ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1; + + if (!call_reloc_p) + h->pointer_equality_needed = 1; + + /* We must not create a stub for a symbol that has + relocations related to taking the function's address. + This doesn't apply to VxWorks, where CALL relocs refer + to a .got.plt entry instead of a normal .got entry. */ + if (!htab->is_vxworks && (!can_make_dynamic_p || !call_reloc_p)) + ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE; + } + /* Relocations against the special VxWorks __GOTT_BASE__ and __GOTT_INDEX__ symbols must be left to the loader. Allocate room for them in .rela.dyn. */ @@ -8387,28 +8423,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, h->plt.plist->need_comp = TRUE; } - /* We must not create a stub for a symbol that has relocations - related to taking the function's address. This doesn't apply to - VxWorks, where CALL relocs refer to a .got.plt entry instead of - a normal .got entry. */ - if (!htab->is_vxworks && h != NULL) - switch (r_type) - { - default: - ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE; - break; - case R_MIPS16_CALL16: - case R_MIPS_CALL16: - case R_MIPS_CALL_HI16: - case R_MIPS_CALL_LO16: - case R_MIPS_JALR: - case R_MICROMIPS_CALL16: - case R_MICROMIPS_CALL_HI16: - case R_MICROMIPS_CALL_LO16: - case R_MICROMIPS_JALR: - break; - } - /* See if this reloc would need to refer to a MIPS16 hard-float stub, if there is one. We only need to handle global symbols here; we decide whether to keep or delete stubs for local symbols diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 6beeb25..b04f027 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,22 @@ +2013-10-13 Richard Sandiford <rdsandiford@googlemail.com> + + * ld-mips-elf/pic-and-nonpic-6-n32.ad, + ld-mips-elf/pic-and-nonpic-6-n32.dd, + ld-mips-elf/pic-and-nonpic-6-n32.gd, + ld-mips-elf/pic-and-nonpic-6-n32.nd, + ld-mips-elf/pic-and-nonpic-6-n32.rd, + ld-mips-elf/pic-and-nonpic-6-n64.ad, + ld-mips-elf/pic-and-nonpic-6-n64.dd, + ld-mips-elf/pic-and-nonpic-6-n64.gd, + ld-mips-elf/pic-and-nonpic-6-n64.nd, + ld-mips-elf/pic-and-nonpic-6-n64.rd, + ld-mips-elf/pic-and-nonpic-6-o32.ad, + ld-mips-elf/pic-and-nonpic-6-o32.dd, + ld-mips-elf/pic-and-nonpic-6-o32.gd, + ld-mips-elf/pic-and-nonpic-6-o32.nd, + ld-mips-elf/pic-and-nonpic-6-o32.rd: Fix symbol value of extf4. + No longer expect extf3, extf4 and extd2 to be in the global GOT. + 2013-10-03 Will Newton <will.newton@linaro.org> * ld-ifunc/ifunc.exp: Enable ifunc tests for AArch64. diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.ad b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.ad index fab5581..5df3c6c 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.ad +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.ad @@ -16,10 +16,10 @@ Dynamic section at offset .* contains .*: 0x70000001 \(MIPS_RLD_VERSION\) * 1 0x70000005 \(MIPS_FLAGS\) * NOTPOT 0x70000006 \(MIPS_BASE_ADDRESS\) * 0x40000 - 0x7000000a \(MIPS_LOCAL_GOTNO\) * 2 + 0x7000000a \(MIPS_LOCAL_GOTNO\) * 5 0x70000011 \(MIPS_SYMTABNO\) * 12 0x70000012 \(MIPS_UNREFEXTNO\) * .* - 0x70000013 \(MIPS_GOTSYM\) * 0x5 + 0x70000013 \(MIPS_GOTSYM\) * 0x8 0x00000014 \(PLTREL\) * REL 0x00000017 \(JMPREL\) * 0x43028 0x00000002 \(PLTRELSZ\) * 24 \(bytes\) diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.dd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.dd index df8d02a..276d874 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.dd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.dd @@ -2,13 +2,13 @@ # # -32752: lazy resolution function # -32748: reserved for module pointer -# -32744: extf2's GOT entry (undefined 0) -# -32740: extf3's GOT entry (PLT entry) -# -32736: extd2's GOT entry (copy reloc) -# -32732: extf1's GOT entry (.MIPS.stubs entry) -# -32728: extd1's GOT entry (undefined 0) -# -32724: extf4's GOT entry (PLT entry) -# -32620: extd4's GOT entry (undefined 0, reloc only) +# -32744: extd2's local GOT entry (copy reloc) +# -32740: extf3's local GOT entry (PLT entry) +# -32736: extf4's local GOT entry (PLT entry) +# -32732: extf2's global GOT entry (undefined 0) +# -32728: extf1's global GOT entry (.MIPS.stubs entry) +# -32724: extd1's global GOT entry (undefined 0) +# -32720: extd4's global GOT entry (undefined 0, reloc only) .* @@ -61,14 +61,14 @@ Disassembly of section \.text: 44020: 3c1c0006 lui gp,0x6 44024: 0399e021 addu gp,gp,t9 44028: 279c3fd0 addiu gp,gp,16336 - 4402c: 8f998024 lw t9,-32732\(gp\) - 44030: 8f848018 lw a0,-32744\(gp\) - 44034: 8f858028 lw a1,-32728\(gp\) + 4402c: 8f998028 lw t9,-32728\(gp\) + 44030: 8f848024 lw a0,-32732\(gp\) + 44034: 8f85802c lw a1,-32724\(gp\) 44038: 0320f809 jalr t9 - 4403c: 8f868020 lw a2,-32736\(gp\) + 4403c: 8f868018 lw a2,-32744\(gp\) 44040: 8f99801c lw t9,-32740\(gp\) 44044: 03200008 jr t9 - 44048: 8f84802c lw a0,-32724\(gp\) + 44048: 8f848020 lw a0,-32736\(gp\) 0004404c <f3>: 4404c: 03e00008 jr ra @@ -98,5 +98,5 @@ Disassembly of section \.MIPS\.stubs: 440a0: 8f998010 lw t9,-32752\(gp\) 440a4: 03e07821 move t3,ra 440a8: 0320f809 jalr t9 - 440ac: 24180008 li t8,8 + 440ac: 24180009 li t8,9 \.\.\. diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.gd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.gd index 8b6b5a0..d5d1b42 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.gd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.gd @@ -7,14 +7,17 @@ Primary GOT: 000a0000 -32752\(gp\) 00000000 Lazy resolver 000a0004 -32748\(gp\) 80000000 Module pointer \(GNU extension\) + Local entries: + Address Access Initial + 000a0008 -32744\(gp\) 000a2000 + 000a000c -32740\(gp\) 00043080 + 000a0010 -32736\(gp\) 00043060 + Global entries: Address Access Initial Sym\.Val\. Type Ndx Name - 000a0008 -32744\(gp\) 00000000 00000000 FUNC UND extf2 - 000a000c -32740\(gp\) 00000000 00000000 FUNC UND extf3 - 000a0010 -32736\(gp\) 000a2000 000a2000 OBJECT 16 extd2 - 000a0014 -32732\(gp\) 000440a0 000440a0 FUNC UND extf1 - 000a0018 -32728\(gp\) 00000000 00000000 OBJECT UND extd1 - 000a001c -32724\(gp\) 00000000 00000000 FUNC UND extf4 + 000a0014 -32732\(gp\) 00000000 00000000 FUNC UND extf2 + 000a0018 -32728\(gp\) 000440a0 000440a0 FUNC UND extf1 + 000a001c -32724\(gp\) 00000000 00000000 OBJECT UND extd1 000a0020 -32720\(gp\) 00000000 00000000 OBJECT UND extd4 @@ -27,6 +30,6 @@ PLT GOT: Entries: Address Initial Sym.Val. Type Ndx Name - 00081008 00043040 00000000 FUNC UND extf4 + 00081008 00043040 00043060 FUNC UND extf4 0008100c 00043040 00000000 FUNC UND extf5 00081010 00043040 00000000 FUNC UND extf3 diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.nd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.nd index 07bfa6b..f93c741 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.nd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.nd @@ -1,17 +1,40 @@ Symbol table '\.dynsym' contains .*: +# +# extf4 is referenced by a JAL and .word. The former requires a PLT entry +# and the latter requires pointer equality, which means a symbol value is +# needed. #... -.*: 00000000 +0 +FUNC +GLOBAL +DEFAULT +UND +extf5 +.*: 0+43060 +0 +FUNC +GLOBAL +DEFAULT \[MIPS PLT\] +UND +extf4 +# +# extf5 is called but does not have its address taken. It needs a PLT +# but no symbol value should be set. +#... +.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf5 +# +# extd2 is referenced by %got, .word and %hi/%lo. The last pair forces +# a copy reloc. +# +.*: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2 +# +# extf3 is referenced by a JAL and a GOT CALL reloc. The JAL forces a PLT +# that the GOT CALL reloc will also use, but pointer equality isn't needed +# and so no symbol value should be set. +# +.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3 +# +# extd3 is referenced by .word and %hi/%lo. The latter pair forces +# a copy reloc. +#... +.*: 0+a2018 +28 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd3 +# # The index on the next line should correspond to MIPS_GOTSYM, # and the remaining symbols should have the same order as the # GOT layout given in the *.dd dump. -#... - *5: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2 - *6: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3 - *7: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2 - *8: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1 - *9: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1 - *10: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf4 +# + *8: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2 + *9: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1 + *10: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1 *11: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd4 #pass diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.rd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.rd index 0fd5b7e..afeae98 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.rd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.rd @@ -2,13 +2,13 @@ Relocation section '\.rel\.dyn' at offset .* contains .*: * Offset * Info * Type * Sym\.Value * Sym\. Name 00000000 * 00000000 * R_MIPS_NONE * -000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3 000a2000 * [^ ]*7e * R_MIPS_COPY * 000a2000 * extd2 +000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3 000a1000 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd1 000a1014 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd4 Relocation section '\.rel\.plt' at offset .* contains .*: * Offset * Info * Type * Sym\.Value * Sym\. Name -00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf4 +00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00043060 * extf4 0008100c * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf5 00081010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf3 diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.ad b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.ad index 5550483..d8fc300 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.ad +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.ad @@ -16,10 +16,10 @@ Dynamic section at offset .* contains .*: 0x0+70000001 \(MIPS_RLD_VERSION\) * 1 0x0+70000005 \(MIPS_FLAGS\) * NOTPOT 0x0+70000006 \(MIPS_BASE_ADDRESS\) * 0x40000 - 0x0+7000000a \(MIPS_LOCAL_GOTNO\) * 2 + 0x0+7000000a \(MIPS_LOCAL_GOTNO\) * 5 0x0+70000011 \(MIPS_SYMTABNO\) * 12 0x0+70000012 \(MIPS_UNREFEXTNO\) * .* - 0x0+70000013 \(MIPS_GOTSYM\) * 0x5 + 0x0+70000013 \(MIPS_GOTSYM\) * 0x8 0x0+00000014 \(PLTREL\) * REL 0x0+00000017 \(JMPREL\) * 0x43050 0x0+00000002 \(PLTRELSZ\) * 48 \(bytes\) diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.dd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.dd index 2480623..fbb3615 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.dd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.dd @@ -1,14 +1,14 @@ # GOT layout: # # -32752: lazy resolution function -# -32744: reserved for module pointer -# -32736: extf2's GOT entry (undefined 0) -# -32728: extf3's GOT entry (PLT entry) -# -32720: extd2's GOT entry (copy reloc) -# -32712: extf1's GOT entry (.MIPS.stubs entry) -# -32704: extd1's GOT entry (undefined 0) -# -32696: extf4's GOT entry (PLT entry) -# -32688: extd4's GOT entry (undefined 0, reloc only) +# -32748: reserved for module pointer +# -32744: extd2's local GOT entry (copy reloc) +# -32740: extf3's local GOT entry (PLT entry) +# -32736: extf4's local GOT entry (PLT entry) +# -32732: extf2's global GOT entry (undefined 0) +# -32728: extf1's global GOT entry (.MIPS.stubs entry) +# -32724: extd1's global GOT entry (undefined 0) +# -32720: extd4's global GOT entry (undefined 0, reloc only) .* @@ -61,14 +61,14 @@ Disassembly of section \.text: 44020: 3c1c0006 lui gp,0x6 44024: 0399e021 addu gp,gp,t9 44028: 279c3fd0 addiu gp,gp,16336 - 4402c: df998038 ld t9,-32712\(gp\) - 44030: df848020 ld a0,-32736\(gp\) - 44034: df858040 ld a1,-32704\(gp\) + 4402c: df998040 ld t9,-32704\(gp\) + 44030: df848038 ld a0,-32712\(gp\) + 44034: df858048 ld a1,-32696\(gp\) 44038: 0320f809 jalr t9 - 4403c: df868030 ld a2,-32720\(gp\) + 4403c: df868020 ld a2,-32736\(gp\) 44040: df998028 ld t9,-32728\(gp\) 44044: 03200008 jr t9 - 44048: df848048 ld a0,-32696\(gp\) + 44048: df848030 ld a0,-32720\(gp\) 0+4404c <f3>: 4404c: 03e00008 jr ra @@ -98,5 +98,5 @@ Disassembly of section \.MIPS\.stubs: 440a0: df998010 ld t9,-32752\(gp\) 440a4: 03e0782d move t3,ra 440a8: 0320f809 jalr t9 - 440ac: 64180008 daddiu t8,zero,8 + 440ac: 64180009 daddiu t8,zero,9 \.\.\. diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.gd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.gd index 767d150..46cbcdd 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.gd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.gd @@ -1,32 +1,35 @@ Primary GOT: - Canonical gp value: 00000000000a7ff0 + Canonical gp value: 0+0a7ff0 Reserved entries: - Address Access Initial Purpose - 00000000000a0000 -32752\(gp\) 0000000000000000 Lazy resolver - 00000000000a0008 -32744\(gp\) 8000000000000000 Module pointer \(GNU extension\) + * Address * Access * Initial Purpose + 0+0a0000 -32752\(gp\) 0+ Lazy resolver + 0+0a0008 -32744\(gp\) 8000000000000000 Module pointer \(GNU extension\) + + Local entries: + * Address * Access * Initial + 0+0a0010 -32736\(gp\) 0+0a2000 + 0+0a0018 -32728\(gp\) 0+0430c0 + 0+0a0020 -32720\(gp\) 0+0430a0 Global entries: - Address Access Initial Sym\.Val\. Type Ndx Name - 00000000000a0010 -32736\(gp\) 0000000000000000 0000000000000000 FUNC UND extf2 - 00000000000a0018 -32728\(gp\) 0000000000000000 0000000000000000 FUNC UND extf3 - 00000000000a0020 -32720\(gp\) 00000000000a2000 00000000000a2000 OBJECT 16 extd2 - 00000000000a0028 -32712\(gp\) 00000000000440a0 00000000000440a0 FUNC UND extf1 - 00000000000a0030 -32704\(gp\) 0000000000000000 0000000000000000 OBJECT UND extd1 - 00000000000a0038 -32696\(gp\) 0000000000000000 0000000000000000 FUNC UND extf4 - 00000000000a0040 -32688\(gp\) 0000000000000000 0000000000000000 OBJECT UND extd4 + * Address * Access * Initial * Sym\.Val\. * Type * Ndx Name + 0+0a0028 -32712\(gp\) 0+000000 0+000000 FUNC UND extf2 + 0+0a0030 -32704\(gp\) 0+0440a0 0+0440a0 FUNC UND extf1 + 0+0a0038 -32696\(gp\) 0+000000 0+000000 OBJECT UND extd1 + 0+0a0040 -32688\(gp\) 0+000000 0+000000 OBJECT UND extd4 PLT GOT: Reserved entries: - Address Initial Purpose - 0000000000081000 0000000000000000 PLT lazy resolver - 0000000000081008 0000000000000000 Module pointer + * Address * Initial * Purpose + 0+081000 0+ PLT lazy resolver + 0+081008 0+ Module pointer Entries: - Address Initial Sym.Val. Type Ndx Name - 0000000000081010 0000000000043080 0000000000000000 FUNC UND extf4 - 0000000000081018 0000000000043080 0000000000000000 FUNC UND extf5 - 0000000000081020 0000000000043080 0000000000000000 FUNC UND extf3 + * Address * Initial * Sym.Val. * Type * Ndx Name + 0+081010 0+043080 0+0430a0 FUNC UND extf4 + 0+081018 0+043080 0+000000 FUNC UND extf5 + 0+081020 0+043080 0+000000 FUNC UND extf3 diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.nd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.nd index 867389b..63b3fc4 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.nd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.nd @@ -1,17 +1,40 @@ Symbol table '\.dynsym' contains .*: +# +# extf4 is referenced by a JAL and .word. The former requires a PLT entry +# and the latter requires pointer equality, which means a symbol value is +# needed. +#... +.*: 0+430a0 +0 +FUNC +GLOBAL +DEFAULT \[MIPS PLT\] +UND +extf4 +# +# extf5 is called but does not have its address taken. It needs a PLT +# but no symbol value should be set. #... .*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf5 +# +# extd2 is referenced by %got, .word and %hi/%lo. The last pair forces +# a copy reloc. +# +.*: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2 +# +# extf3 is referenced by a JAL and a GOT CALL reloc. The JAL forces a PLT +# that the GOT CALL reloc will also use, but pointer equality isn't needed +# and so no symbol value should be set. +# +.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3 +# +# extd3 is referenced by .word and %hi/%lo. The latter pair forces +# a copy reloc. +#... +.*: 0+a2018 +28 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd3 +# # The index on the next line should correspond to MIPS_GOTSYM, # and the remaining symbols should have the same order as the # GOT layout given in the *.dd dump. -#... - *5: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2 - *6: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3 - *7: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2 - *8: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1 - *9: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1 - *10: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf4 +# + *8: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2 + *9: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1 + *10: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1 *11: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd4 #pass diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.rd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.rd index 666785e..2b25b0a 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.rd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.rd @@ -4,10 +4,10 @@ Relocation section '\.rel\.dyn' at offset .* contains .*: 0+00000 * 0+ * R_MIPS_NONE * *Type2: R_MIPS_NONE * *Type3: R_MIPS_NONE * -0+a2018 * [^ ]*7e * R_MIPS_COPY * 0+a2018 * extd3 +0+a2000 * [^ ]*7e * R_MIPS_COPY * 0+a2000 * extd2 *Type2: R_MIPS_NONE * *Type3: R_MIPS_NONE * -0+a2000 * [^ ]*7e * R_MIPS_COPY * 0+a2000 * extd2 +0+a2018 * [^ ]*7e * R_MIPS_COPY * 0+a2018 * extd3 *Type2: R_MIPS_NONE * *Type3: R_MIPS_NONE * 0+a1000 * [^ ]*03 * R_MIPS_REL32 * 0+00000 * extd1 @@ -19,7 +19,7 @@ Relocation section '\.rel\.dyn' at offset .* contains .*: Relocation section '\.rel\.plt' at offset .* contains .*: * Offset * Info * Type * Sym\. Value * Sym\. Name -0+81010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 0+00000 * extf4 +0+81010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 0+430a0 * extf4 *Type2: R_MIPS_NONE * *Type3: R_MIPS_NONE * 0+81018 * [^ ]*7f * R_MIPS_JUMP_SLOT * 0+00000 * extf5 diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.ad b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.ad index fab5581..5df3c6c 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.ad +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.ad @@ -16,10 +16,10 @@ Dynamic section at offset .* contains .*: 0x70000001 \(MIPS_RLD_VERSION\) * 1 0x70000005 \(MIPS_FLAGS\) * NOTPOT 0x70000006 \(MIPS_BASE_ADDRESS\) * 0x40000 - 0x7000000a \(MIPS_LOCAL_GOTNO\) * 2 + 0x7000000a \(MIPS_LOCAL_GOTNO\) * 5 0x70000011 \(MIPS_SYMTABNO\) * 12 0x70000012 \(MIPS_UNREFEXTNO\) * .* - 0x70000013 \(MIPS_GOTSYM\) * 0x5 + 0x70000013 \(MIPS_GOTSYM\) * 0x8 0x00000014 \(PLTREL\) * REL 0x00000017 \(JMPREL\) * 0x43028 0x00000002 \(PLTRELSZ\) * 24 \(bytes\) diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.dd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.dd index 7f101ac..e10a0af 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.dd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.dd @@ -2,13 +2,13 @@ # # -32752: lazy resolution function # -32748: reserved for module pointer -# -32744: extf2's GOT entry (undefined 0) -# -32740: extf3's GOT entry (PLT entry) -# -32736: extd2's GOT entry (copy reloc) -# -32732: extf1's GOT entry (.MIPS.stubs entry) -# -32728: extd1's GOT entry (undefined 0) -# -32724: extf4's GOT entry (PLT entry) -# -32620: extd4's GOT entry (undefined 0, reloc only) +# -32744: extd2's local GOT entry (copy reloc) +# -32740: extf3's local GOT entry (PLT entry) +# -32736: extf4's local GOT entry (PLT entry) +# -32732: extf2's global GOT entry (undefined 0) +# -32728: extf1's global GOT entry (.MIPS.stubs entry) +# -32724: extd1's global GOT entry (undefined 0) +# -32720: extd4's global GOT entry (undefined 0, reloc only) .* @@ -61,14 +61,14 @@ Disassembly of section \.text: 44020: 3c1c0006 lui gp,0x6 44024: 279c3fd0 addiu gp,gp,16336 44028: 0399e021 addu gp,gp,t9 - 4402c: 8f998024 lw t9,-32732\(gp\) - 44030: 8f848018 lw a0,-32744\(gp\) - 44034: 8f858028 lw a1,-32728\(gp\) + 4402c: 8f998028 lw t9,-32728\(gp\) + 44030: 8f848024 lw a0,-32732\(gp\) + 44034: 8f85802c lw a1,-32724\(gp\) 44038: 0320f809 jalr t9 - 4403c: 8f868020 lw a2,-32736\(gp\) + 4403c: 8f868018 lw a2,-32744\(gp\) 44040: 8f99801c lw t9,-32740\(gp\) 44044: 03200008 jr t9 - 44048: 8f84802c lw a0,-32724\(gp\) + 44048: 8f848020 lw a0,-32736\(gp\) 0004404c <f3>: 4404c: 03e00008 jr ra @@ -98,5 +98,5 @@ Disassembly of section \.MIPS\.stubs: 440a0: 8f998010 lw t9,-32752\(gp\) 440a4: 03e07821 move t7,ra 440a8: 0320f809 jalr t9 - 440ac: 24180008 li t8,8 + 440ac: 24180009 li t8,9 \.\.\. diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.gd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.gd index 8b6b5a0..d5d1b42 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.gd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.gd @@ -7,14 +7,17 @@ Primary GOT: 000a0000 -32752\(gp\) 00000000 Lazy resolver 000a0004 -32748\(gp\) 80000000 Module pointer \(GNU extension\) + Local entries: + Address Access Initial + 000a0008 -32744\(gp\) 000a2000 + 000a000c -32740\(gp\) 00043080 + 000a0010 -32736\(gp\) 00043060 + Global entries: Address Access Initial Sym\.Val\. Type Ndx Name - 000a0008 -32744\(gp\) 00000000 00000000 FUNC UND extf2 - 000a000c -32740\(gp\) 00000000 00000000 FUNC UND extf3 - 000a0010 -32736\(gp\) 000a2000 000a2000 OBJECT 16 extd2 - 000a0014 -32732\(gp\) 000440a0 000440a0 FUNC UND extf1 - 000a0018 -32728\(gp\) 00000000 00000000 OBJECT UND extd1 - 000a001c -32724\(gp\) 00000000 00000000 FUNC UND extf4 + 000a0014 -32732\(gp\) 00000000 00000000 FUNC UND extf2 + 000a0018 -32728\(gp\) 000440a0 000440a0 FUNC UND extf1 + 000a001c -32724\(gp\) 00000000 00000000 OBJECT UND extd1 000a0020 -32720\(gp\) 00000000 00000000 OBJECT UND extd4 @@ -27,6 +30,6 @@ PLT GOT: Entries: Address Initial Sym.Val. Type Ndx Name - 00081008 00043040 00000000 FUNC UND extf4 + 00081008 00043040 00043060 FUNC UND extf4 0008100c 00043040 00000000 FUNC UND extf5 00081010 00043040 00000000 FUNC UND extf3 diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.nd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.nd index 07bfa6b..f93c741 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.nd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.nd @@ -1,17 +1,40 @@ Symbol table '\.dynsym' contains .*: +# +# extf4 is referenced by a JAL and .word. The former requires a PLT entry +# and the latter requires pointer equality, which means a symbol value is +# needed. #... -.*: 00000000 +0 +FUNC +GLOBAL +DEFAULT +UND +extf5 +.*: 0+43060 +0 +FUNC +GLOBAL +DEFAULT \[MIPS PLT\] +UND +extf4 +# +# extf5 is called but does not have its address taken. It needs a PLT +# but no symbol value should be set. +#... +.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf5 +# +# extd2 is referenced by %got, .word and %hi/%lo. The last pair forces +# a copy reloc. +# +.*: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2 +# +# extf3 is referenced by a JAL and a GOT CALL reloc. The JAL forces a PLT +# that the GOT CALL reloc will also use, but pointer equality isn't needed +# and so no symbol value should be set. +# +.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3 +# +# extd3 is referenced by .word and %hi/%lo. The latter pair forces +# a copy reloc. +#... +.*: 0+a2018 +28 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd3 +# # The index on the next line should correspond to MIPS_GOTSYM, # and the remaining symbols should have the same order as the # GOT layout given in the *.dd dump. -#... - *5: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2 - *6: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3 - *7: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2 - *8: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1 - *9: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1 - *10: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf4 +# + *8: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2 + *9: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1 + *10: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1 *11: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd4 #pass diff --git a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.rd b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.rd index 0fd5b7e..afeae98 100644 --- a/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.rd +++ b/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.rd @@ -2,13 +2,13 @@ Relocation section '\.rel\.dyn' at offset .* contains .*: * Offset * Info * Type * Sym\.Value * Sym\. Name 00000000 * 00000000 * R_MIPS_NONE * -000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3 000a2000 * [^ ]*7e * R_MIPS_COPY * 000a2000 * extd2 +000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3 000a1000 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd1 000a1014 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd4 Relocation section '\.rel\.plt' at offset .* contains .*: * Offset * Info * Type * Sym\.Value * Sym\. Name -00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf4 +00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00043060 * extf4 0008100c * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf5 00081010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf3 |