| # Expect script for common symbol override, MIPS variation. | |
| # | |
| # Copyright (C) 2011-2021 Free Software Foundation, Inc. | |
| # | |
| # This file is part of the GNU Binutils. | |
| # | |
| # This program is free software; you can redistribute it and/or modify | |
| # it under the terms of the GNU General Public License as published by | |
| # the Free Software Foundation; either version 3 of the License, or | |
| # (at your option) any later version. | |
| # | |
| # This program is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program; if not, write to the Free Software | |
| # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | |
| # MA 02110-1301, USA. | |
| # | |
| # | |
| # Written by Maciej W. Rozycki <macro@codesourcery.com> | |
| # | |
| # This test is for MIPS shared-library targets. | |
| if { ![istarget mips*-*-*] | |
| || ![is_elf_format] | |
| || ![check_shared_lib_support] } { | |
| return | |
| } | |
| set has_o32abi [expr ![istarget *-*-openbsd*] \ | |
| && ![istarget mips64*-ps2-elf*]] | |
| set has_n32abi [expr [istarget *-img-elf*] \ | |
| || [istarget *-mti-elf*] \ | |
| || [istarget *-ps2-elf*] \ | |
| || [istarget *-sde-elf*] \ | |
| || [istarget *-*-freebsd*] \ | |
| || [istarget *-*-irix6*] \ | |
| || [istarget *-*-kfreebsd*-gnu] \ | |
| || [istarget *-*-linux*]] | |
| set has_n64abi [expr [istarget *-*-freebsd*] \ | |
| || [istarget *-*-irix6*] \ | |
| || [istarget *-*-kfreebsd*-gnu] \ | |
| || [istarget *-*-linux*] \ | |
| || [istarget *-*-netbsd*] \ | |
| || [istarget *-*-openbsd*]] | |
| if {[istarget *-img-elf*] \ | |
| || [istarget *-mti-elf*] \ | |
| || [istarget *-sde-elf*] \ | |
| || [istarget *-*-netbsd*] \ | |
| || [istarget *-*-linux*] \ | |
| || [istarget *-*-openbsd*] \ | |
| || [istarget *-*-sysv4*] } { | |
| if [istarget *el-*-*] { | |
| set abi_ldemul(o32) elf32ltsmip | |
| set abi_ldemul(n32) elf32ltsmipn32 | |
| set abi_ldemul(n64) elf64ltsmip | |
| } else { | |
| set abi_ldemul(o32) elf32btsmip | |
| set abi_ldemul(n32) elf32btsmipn32 | |
| set abi_ldemul(n64) elf64btsmip | |
| } | |
| } elseif { [istarget *-*-freebsd*] \ | |
| || [istarget *-*-kfreebsd*-gnu] } { | |
| if [istarget *el-*-*] { | |
| set abi_ldemul(o32) elf32ltsmip_fbsd | |
| set abi_ldemul(n32) elf32ltsmipn32_fbsd | |
| set abi_ldemul(n64) elf64ltsmip_fbsd | |
| } else { | |
| set abi_ldemul(o32) elf32btsmip_fbsd | |
| set abi_ldemul(n32) elf32btsmipn32_fbsd | |
| set abi_ldemul(n64) elf64btsmip_fbsd | |
| } | |
| } elseif { [istarget *vr4100*-*-elf*] \ | |
| || [istarget *vr4300*-*-elf*] \ | |
| || [istarget *vr5000*-*-elf*] } { | |
| if [istarget *el-*-*] { | |
| set abi_ldemul(o32) elf32l4300 | |
| } else { | |
| set abi_ldemul(o32) elf32b4300 | |
| } | |
| } elseif { [istarget *-ps2-elf*] } { | |
| set abi_ldemul(o32) elf32lr5900 | |
| set abi_ldemul(n32) elf32lr5900n32 | |
| } elseif { [istarget *-*-elf*] \ | |
| || [istarget *-*-rtems*] } { | |
| if [istarget *el-*-*] { | |
| set abi_ldemul(o32) elf32elmip | |
| } else { | |
| set abi_ldemul(o32) elf32ebmip | |
| } | |
| } else { | |
| if [istarget *el-*-*] { | |
| set abi_ldemul(o32) elf32lsmip | |
| set abi_ldemul(n32) elf32lmipn32 | |
| set abi_ldemul(n64) elf64lmip | |
| } else { | |
| set abi_ldemul(o32) elf32bsmip | |
| set abi_ldemul(n32) elf32bmipn32 | |
| set abi_ldemul(n64) elf64bmip | |
| } | |
| } | |
| proc mips_comm_data_test { abi flag emul reloc } { | |
| set testname "MIPS $abi/$reloc common symbol override test" | |
| # There's no "-z copyreloc" option, deal with it. | |
| set ZFLAG [string map [list copyreloc "" nocopyreloc "-z $reloc"] $reloc] | |
| set AFLAGS "$flag" | |
| set LDFLAGS "-m$emul" | |
| # Define a global symbol. | |
| run_ld_link_tests [list \ | |
| [list \ | |
| "$testname (auxiliary shared object build)" \ | |
| "$LDFLAGS -shared" "" \ | |
| "$AFLAGS -call_shared" \ | |
| { ../ld-elf/comm-data1.s } \ | |
| { \ | |
| { readelf -s ../ld-elf/comm-data1.sd } \ | |
| } \ | |
| "libmips-$abi-$reloc-comm-data.so" \ | |
| ] \ | |
| ] | |
| # Set the pointer size according to the ABI. | |
| if { $abi == "n64" } { | |
| append AFLAGS " --defsym ELF64=1" | |
| } | |
| # Verify that a common symbol has been converted to an undefined | |
| # reference to the global symbol of the same name defined above | |
| # and that the debug reference has been dropped. | |
| run_ld_link_tests [list \ | |
| [list \ | |
| "$testname" \ | |
| "$LDFLAGS -call_shared $ZFLAG -T ../ld-elf/comm-data2.ld -Ltmpdir\ | |
| -lmips-$abi-$reloc-comm-data" "" \ | |
| "$AFLAGS -call_nonpic" \ | |
| { ../ld-elf/comm-data2.s } \ | |
| { \ | |
| { readelf -s ../ld-elf/comm-data2.sd } \ | |
| { readelf -r ../ld-elf/comm-data2.rd } \ | |
| { readelf "-x .debug_foo" ../ld-elf/comm-data2.xd } \ | |
| } \ | |
| "mips-$abi-$reloc-comm-data" \ | |
| ] \ | |
| ] | |
| } | |
| # For targets that default to a specific ISA (instead of "from-abi"), | |
| # the 64-bit -march option is required to override it, like for | |
| # "mipsisa32r2el-*-*". | |
| set abis "" | |
| if $has_o32abi { | |
| lappend abis o32 -32 $abi_ldemul(o32) | |
| } | |
| if $has_n32abi { | |
| lappend abis n32 "-n32 -march=mips3" $abi_ldemul(n32) | |
| } | |
| if $has_n64abi { | |
| lappend abis n64 "-64 -march=mips3" $abi_ldemul(n64) | |
| } | |
| set relocs { copyreloc nocopyreloc } | |
| foreach { abi flag emul } $abis { | |
| foreach reloc $relocs { | |
| mips_comm_data_test $abi $flag $emul $reloc | |
| } | |
| } |