1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
# Expect script for common symbol override, MIPS variation.
#
# Copyright (C) 2011-2020 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
}
}
|