mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
Current toolchains on MIPS targets that we care about are reasonably modern and we do not need this link script exception for MIPS anymore. This should fix issues with newer toolchain versions and .MIPS.abiflags section. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15754
85 lines
2.9 KiB
Plaintext
85 lines
2.9 KiB
Plaintext
#! @PERL@
|
|
|
|
# This script handles linking the tool executables on Linux,
|
|
# statically and at an alternative load address.
|
|
#
|
|
# Linking statically sidesteps all sorts of complications to do with
|
|
# having two copies of the dynamic linker (valgrind's and the
|
|
# client's) coexisting in the same process. The alternative load
|
|
# address is needed because Valgrind itself will load the client at
|
|
# whatever address it specifies, which is almost invariably the
|
|
# default load address. Hence we can't allow Valgrind itself (viz,
|
|
# the tool executable) to be loaded at that address.
|
|
#
|
|
# Unfortunately there's no standard way to do 'static link at
|
|
# alternative address', so these link_tool_exe_*.in scripts handle
|
|
# the per-platform hoop-jumping.
|
|
#
|
|
# What we get passed here is:
|
|
# first arg
|
|
# the alternative load address
|
|
# all the rest of the args
|
|
# the gcc invokation to do the final link, that
|
|
# the build system would have done, left to itself
|
|
#
|
|
# We just let the script 'die' if something is wrong, rather than do
|
|
# proper error reporting. We don't expect the users to run this
|
|
# directly. It is only run as part of the build process, with
|
|
# carefully constrained inputs.
|
|
#
|
|
# Linux specific complications:
|
|
#
|
|
# - need to support both old GNU ld and gold: use -Ttext= to
|
|
# set the text segment address if that is all we have. We really
|
|
# need -Ttext-segment. Otherwise with GNU ld sections or notes
|
|
# (like the build-id) don't get at the desired address. But older
|
|
# linkers only know about -Ttext, not -Ttext-segment. So configure
|
|
# checks for us and sets FLAG_T_TEXT.
|
|
#
|
|
# - If all we have is -Ttext, then we need to pass --build-id=none
|
|
# (that is, -Wl,--build-id=none to gcc) if it accepts it, to ensure
|
|
# the linker doesn't add a notes section which ends up at the default
|
|
# load address and so defeats our attempts to keep that address clear
|
|
# for the client. However, older linkers don't support this flag,
|
|
# so it is tested for by configure.in and is shipped to us as part of
|
|
# argv[2 ..].
|
|
#
|
|
# So: what we actually do:
|
|
#
|
|
# pass the specified command to the linker as-is, except, add
|
|
# "-static" and "-Ttext[-segment]=<argv[1]>" to it.
|
|
# Previously we did this by adding these options after the first
|
|
# word of the rest of the arguments, which works in the common case
|
|
# when it's something like "gcc". But the linker invocation itself
|
|
# might be multiple words, say if it's "ccache gcc". So we now put
|
|
# the new options at the end instead.
|
|
#
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
# expect at least: alt-load-address gcc -o foo bar.o
|
|
die "Not enough arguments"
|
|
if (($#ARGV + 1) < 5);
|
|
|
|
my $ala = $ARGV[0];
|
|
shift; # Remove $ala from @ARGV
|
|
|
|
# check for plausible-ish alt load address
|
|
die "Bogus alt-load address"
|
|
if (length($ala) < 3 || index($ala, "0x") != 0);
|
|
|
|
my $cmd = join(" ", @ARGV, "-static -Wl,@FLAG_T_TEXT@=$ala");
|
|
|
|
#print "link_tool_exe_linux: $cmd\n";
|
|
|
|
|
|
# Execute the command:
|
|
my $r = system($cmd);
|
|
|
|
if ($r == 0) {
|
|
exit 0;
|
|
} else {
|
|
exit 1;
|
|
}
|