summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elfxx-mips.c12
-rw-r--r--gas/ChangeLog16
-rw-r--r--gas/config/tc-mips.c13
-rw-r--r--gas/testsuite/gas/mips/jalx-addend-n32.d29
-rw-r--r--gas/testsuite/gas/mips/jalx-addend-n64.d37
-rw-r--r--gas/testsuite/gas/mips/jalx-addend.d28
-rw-r--r--gas/testsuite/gas/mips/jalx-addend.s35
-rw-r--r--gas/testsuite/gas/mips/jalx-imm-n32.d5
-rw-r--r--gas/testsuite/gas/mips/jalx-imm-n64.d5
-rw-r--r--gas/testsuite/gas/mips/jalx-imm.d24
-rw-r--r--gas/testsuite/gas/mips/jalx-imm.s35
-rw-r--r--gas/testsuite/gas/mips/mips.exp8
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/testsuite/ld-mips-elf/jalx-addend-n32.d6
-rw-r--r--ld/testsuite/ld-mips-elf/jalx-addend-n64.d6
-rw-r--r--ld/testsuite/ld-mips-elf/jalx-addend.d26
-rw-r--r--ld/testsuite/ld-mips-elf/mips-elf.exp6
18 files changed, 300 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 64aac63487c..1a9eeb69214 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-20 Maciej W. Rozycki <macro@imgtec.com>
+
+ * elfxx-mips.c (mips_elf_read_rel_addend): Adjust the addend for
+ microMIPS JALX.
+
2016-05-19 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20117
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index cb775bb2d44..b561b430611 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -7780,16 +7780,24 @@ mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
bfd_byte *location;
unsigned int r_type;
bfd_vma addend;
+ bfd_vma bytes;
r_type = ELF_R_TYPE (abfd, rel->r_info);
location = contents + rel->r_offset;
/* Get the addend, which is stored in the input file. */
_bfd_mips_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
- addend = mips_elf_obtain_contents (howto, rel, abfd, contents);
+ bytes = mips_elf_obtain_contents (howto, rel, abfd, contents);
_bfd_mips_elf_reloc_shuffle (abfd, r_type, FALSE, location);
- return addend & howto->src_mask;
+ addend = bytes & howto->src_mask;
+
+ /* Shift is 2, unusually, for microMIPS JALX. Adjust the addend
+ accordingly. */
+ if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c)
+ addend <<= 1;
+
+ return addend;
}
/* REL is a relocation in ABFD that needs a partnering LO16 relocation
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 98947c1e323..5d5672e9d55 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,21 @@
2016-05-20 Maciej W. Rozycki <macro@imgtec.com>
+ * config/tc-mips.c (append_insn): Correct the encoding of a
+ constant argument for microMIPS JALX.
+ (tc_gen_reloc): Correct the encoding of an in-place addend for
+ microMIPS JALX.
+ * testsuite/gas/mips/jalx-addend.d: New test.
+ * testsuite/gas/mips/jalx-addend-n32.d: New test.
+ * testsuite/gas/mips/jalx-addend-n64.d: New test.
+ * testsuite/gas/mips/jalx-imm.d: New test.
+ * testsuite/gas/mips/jalx-imm-n32.d: New test.
+ * testsuite/gas/mips/jalx-imm-n64.d: New test.
+ * testsuite/gas/mips/jalx-addend.s: New test source.
+ * testsuite/gas/mips/jalx-imm.s: New test source.
+ * testsuite/gas/mips/mips.exp: Run the new tests.
+
+2016-05-20 Maciej W. Rozycki <macro@imgtec.com>
+
* config/tc-mips.c: Correct tab-after-space formatting mistakes
throughout.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index ccdda0c7880..233c6415ea5 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -7044,7 +7044,9 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
{
int shift;
- shift = mips_opts.micromips ? 1 : 2;
+ /* Shift is 2, unusually, for microMIPS JALX. */
+ shift = (mips_opts.micromips
+ && strcmp (ip->insn_mo->name, "jalx") != 0) ? 1 : 2;
if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
as_bad (_("jump to misaligned address (0x%lx)"),
(unsigned long) address_expr->X_add_number);
@@ -17225,6 +17227,15 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
Relocations want only the symbol offset. */
reloc->addend = fixp->fx_addnumber + reloc->address;
}
+ else if (HAVE_IN_PLACE_ADDENDS
+ && fixp->fx_r_type == BFD_RELOC_MICROMIPS_JMP
+ && (read_compressed_insn (fixp->fx_frag->fr_literal
+ + fixp->fx_where, 4) >> 26) == 0x3c)
+ {
+ /* Shift is 2, unusually, for microMIPS JALX. Adjust the in-place
+ addend accordingly. */
+ reloc->addend = fixp->fx_addnumber >> 1;
+ }
else
reloc->addend = fixp->fx_addnumber;
diff --git a/gas/testsuite/gas/mips/jalx-addend-n32.d b/gas/testsuite/gas/mips/jalx-addend-n32.d
new file mode 100644
index 00000000000..1abb246f209
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-addend-n32.d
@@ -0,0 +1,29 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JAL/JALX addend encoding (n32)
+#as: -n32 -march=from-abi
+#source: jalx-addend.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f400 0000 jal 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 foo-0x3fffffe
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f000 0000 jalx 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 bar-0x7fffffc
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c jr ra
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 nop
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 jalx 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo-0x7fffffc
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 jal 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 bar-0x7fffffc
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/jalx-addend-n64.d b/gas/testsuite/gas/mips/jalx-addend-n64.d
new file mode 100644
index 00000000000..469261f2d41
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-addend-n64.d
@@ -0,0 +1,37 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JAL/JALX addend encoding (n64)
+#as: -64 -march=from-abi
+#source: jalx-addend.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f400 0000 jal 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 foo-0x3fffffe
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x3fffffe
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x3fffffe
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f000 0000 jalx 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 bar-0x7fffffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c jr ra
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 nop
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 jalx 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo-0x7fffffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 jal 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 bar-0x7fffffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x7fffffc
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/jalx-addend.d b/gas/testsuite/gas/mips/jalx-addend.d
new file mode 100644
index 00000000000..442bc69741b
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-addend.d
@@ -0,0 +1,28 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JAL/JALX addend encoding
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f600 0001 jal 04000002 <bar\+0x3ffefe2>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 foo
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f200 0001 jalx 08000004 <bar\+0x7ffefe4>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 bar
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c jr ra
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 nop
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 76000001 jalx 08000004 <bar\+0x7ffefe4>
+[ ]*[0-9a-f]+: R_MIPS_26 foo
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0e000001 jal 08000004 <bar\+0x7ffefe4>
+[ ]*[0-9a-f]+: R_MIPS_26 bar
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/jalx-addend.s b/gas/testsuite/gas/mips/jalx-addend.s
new file mode 100644
index 00000000000..b9b0db34330
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-addend.s
@@ -0,0 +1,35 @@
+ .text
+ .set noreorder
+ .space 0x1000
+
+ .align 4
+ .set micromips
+ .globl foo
+ .ent foo
+foo:
+ nor $0, $0
+ jal foo - 0x3fffffe
+ nor $0, $0
+ jalx bar - 0x7fffffc
+ nor $0, $0
+ jalr $0, $ra
+ nor $0, $0
+ .end foo
+
+ .align 4
+ .set nomicromips
+ .globl bar
+ .ent bar
+bar:
+ nor $0, $0
+ jalx foo - 0x7fffffc
+ nor $0, $0
+ jal bar - 0x7fffffc
+ nor $0, $0
+ jalr $0, $ra
+ nor $0, $0
+ .end bar
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .align 4, 0
+ .space 16
diff --git a/gas/testsuite/gas/mips/jalx-imm-n32.d b/gas/testsuite/gas/mips/jalx-imm-n32.d
new file mode 100644
index 00000000000..188bb4933d4
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-imm-n32.d
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JAL/JALX immediate operand encoding (n32)
+#as: -n32 -march=from-abi
+#source: jalx-imm.s
+#dump: jalx-imm.d
diff --git a/gas/testsuite/gas/mips/jalx-imm-n64.d b/gas/testsuite/gas/mips/jalx-imm-n64.d
new file mode 100644
index 00000000000..7b0c23e7e7e
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-imm-n64.d
@@ -0,0 +1,5 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JAL/JALX immediate operand encoding (n64)
+#as: -64 -march=from-abi
+#source: jalx-imm.s
+#dump: jalx-imm.d
diff --git a/gas/testsuite/gas/mips/jalx-imm.d b/gas/testsuite/gas/mips/jalx-imm.d
new file mode 100644
index 00000000000..aa487ffc176
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-imm.d
@@ -0,0 +1,24 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JAL/JALX immediate operand encoding
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f600 0001 jal 0+4000002 <bar\+0x3ffefe2>
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f200 0001 jalx 0+8000004 <bar\+0x7ffefe4>
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c jr ra
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 nop
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 76000001 jalx 0+8000004 <bar\+0x7ffefe4>
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0e000001 jal 0+8000004 <bar\+0x7ffefe4>
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/jalx-imm.s b/gas/testsuite/gas/mips/jalx-imm.s
new file mode 100644
index 00000000000..eef871771d7
--- /dev/null
+++ b/gas/testsuite/gas/mips/jalx-imm.s
@@ -0,0 +1,35 @@
+ .text
+ .set noreorder
+ .space 0x1000
+
+ .align 4
+ .set micromips
+ .globl foo
+ .ent foo
+foo:
+ nor $0, $0
+ jal 0x4000002
+ nor $0, $0
+ jalx 0x8000004
+ nor $0, $0
+ jalr $0, $ra
+ nor $0, $0
+ .end foo
+
+ .align 4
+ .set nomicromips
+ .globl bar
+ .ent bar
+bar:
+ nor $0, $0
+ jalx 0x8000004
+ nor $0, $0
+ jal 0x8000004
+ nor $0, $0
+ jalr $0, $ra
+ nor $0, $0
+ .end bar
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .align 4, 0
+ .space 16
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index 88d15c8e335..1b1ac02db5d 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -794,6 +794,14 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "mips16-jalx"
run_dump_test "mips-jalx"
run_dump_test "mips-jalx-2"
+ run_dump_test "jalx-imm"
+ run_dump_test "jalx-addend"
+ if $has_newabi {
+ run_dump_test "jalx-imm-n32"
+ run_dump_test "jalx-addend-n32"
+ run_dump_test "jalx-imm-n64"
+ run_dump_test "jalx-addend-n64"
+ }
# Check MIPS16 HI16/LO16 relocations
run_dump_test "mips16-hilo"
if $has_newabi {
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 638f38b0c18..334d49a71a9 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2016-05-20 Maciej W. Rozycki <macro@imgtec.com>
+
+ * testsuite/ld-mips-elf/jalx-addend.d: New test.
+ * testsuite/ld-mips-elf/jalx-addend-n32.d: New test.
+ * testsuite/ld-mips-elf/jalx-addend-n64.d: New test.
+ * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
+
2016-05-19 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20117
diff --git a/ld/testsuite/ld-mips-elf/jalx-addend-n32.d b/ld/testsuite/ld-mips-elf/jalx-addend-n32.d
new file mode 100644
index 00000000000..a3644225931
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/jalx-addend-n32.d
@@ -0,0 +1,6 @@
+#name: MIPS JAL/JALX addend calculation (n32)
+#source: ../../../gas/testsuite/gas/mips/jalx-addend.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: jalx-addend.d
diff --git a/ld/testsuite/ld-mips-elf/jalx-addend-n64.d b/ld/testsuite/ld-mips-elf/jalx-addend-n64.d
new file mode 100644
index 00000000000..b6884c50b0f
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/jalx-addend-n64.d
@@ -0,0 +1,6 @@
+#name: MIPS JAL/JALX addend calculation (n64)
+#source: ../../../gas/testsuite/gas/mips/jalx-addend.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: jalx-addend.d
diff --git a/ld/testsuite/ld-mips-elf/jalx-addend.d b/ld/testsuite/ld-mips-elf/jalx-addend.d
new file mode 100644
index 00000000000..39cf6f954f1
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/jalx-addend.d
@@ -0,0 +1,26 @@
+#name: MIPS JAL/JALX addend calculation
+#source: ../../../gas/testsuite/gas/mips/jalx-addend.s
+#as: -EB -32
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f400 0801 jal 0*18001002 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f100 0409 jalx 0*14001024 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 001f 0f3c jr ra
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> 0000 0000 nop
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 75000401 jalx 0*14001004 <.*>
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0d000409 jal 0*14001024 <.*>
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index 44677196839..741f2e28be6 100644
--- a/ld/testsuite/ld-mips-elf/mips-elf.exp
+++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
@@ -168,6 +168,12 @@ if { $linux_gnu } {
"jalx-2"]]
}
+run_dump_test "jalx-addend" [list [list ld $abi_ldflags(o32)]]
+if $has_newabi {
+ run_dump_test "jalx-addend-n32" [list [list ld $abi_ldflags(n32)]]
+ run_dump_test "jalx-addend-n64" [list [list ld $abi_ldflags(n64)]]
+}
+
# Test multi-got link. We only do this on GNU/Linux because it requires
# the "traditional" emulations.
if { $linux_gnu } {