summaryrefslogtreecommitdiffstats
path: root/tools/ld_bfd/ld
blob: 41a9776de0698c8623a33816cb888e646a703f0e (plain)
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
#!/usr/bin/python
# Copyright (c) 2011 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Wrapper for invoking the BFD loader

A simple script to invoke the bfd loader instead of gold.
This script is in a filename "ld" so it can be invoked from gcc
via the -B flag.
"""
# TODO(bradchen): Delete this script when Gold supports linker scripts properly.
import os
import subprocess
import sys

def PathTo(fname):
  if fname[0] == os.pathsep:
    return fname
  for p in os.environ["PATH"].split(os.pathsep):
    fpath = os.path.join(p, fname)
    if os.path.exists(fpath):
      return fpath
  return fname

def FindLDBFD():
  cxx = os.getenv("CXX")
  if not cxx:
    cxx = "gcc"
  popen = subprocess.Popen(cxx + " -print-prog-name=ld",
                           shell=True,
                           stdout=subprocess.PIPE,
                           stdin=subprocess.PIPE)
  (ld, error) = popen.communicate()
  if popen.wait() != 0:
    print "Could not find ld:" + error
    return "ld"
  ld = ld.strip()
  ld_bfd = PathTo(ld + ".bfd")
  if os.access(ld_bfd, os.X_OK):
    return ld_bfd
  return ld

def main():
  args = [FindLDBFD()] + sys.argv[1:]
  print("tools/ld_bfd/ld: exec " + ' '.join(args))
  sys.exit(subprocess.call(args))

if __name__ == "__main__":
  main()