Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / data / dtrace-prelink.sh
1 #!/bin/sh
2
3 # dtrace-prelink.sh: DTrace helper script for Mono
4
5 # Authors:
6 #   Andreas Faerber <andreas.faerber@web.de>
7
8
9 # Assume that PIC object files live in .libs/, non-PIC code in ./
10 PIC=no
11 if test "$1" = "--pic"; then
12         PIC=yes
13         shift
14 fi
15
16 OBJ="$1"
17 PROV="$2"
18
19 shift
20 shift
21
22 FILES="$*"
23
24 OBJS=
25 TMPDIR=.dtrace
26 mkdir -p "${TMPDIR}"
27
28 # Extract relevant object files to temporary directories
29 for FILE in ${FILES}; do
30         if echo "${FILE}" | grep .la > /dev/null; then
31                 LIBDIR=`dirname ${FILE}`
32                 LIB=".libs/`basename ${FILE} .la`.a"
33                 DIR="${TMPDIR}/`basename ${FILE}`"
34                 mkdir -p ${DIR}
35                 (cd "${DIR}" && ${AR} x "../../${LIBDIR}/${LIB}")
36                 TMPOBJS=`ls -1 "${DIR}"`
37                 for TMPOBJ in ${TMPOBJS}; do
38                         LO=`basename "${TMPOBJ}" .o`.lo
39                         SRCOBJ="${TMPOBJ}"
40                         if test x${PIC} = xyes; then
41                                 SRCOBJ=".libs/${SRCOBJ}"
42                         fi
43                         # Overwrite with original version
44                         cp "${LIBDIR}/${SRCOBJ}" "${DIR}/${TMPOBJ}" || cp "${LIBDIR}/${TMPOBJ}" "${DIR}/${TMPOBJ}" || exit
45                         # Add to list
46                         OBJS="${OBJS} ${DIR}/${TMPOBJ}"
47                 done
48         fi
49         if echo "${FILE}" | grep .lo > /dev/null; then
50                 DIR=`dirname ${FILE}`
51                 SRCOBJ=`basename ${FILE} .lo`.o
52                 if test x${PIC} = xyes; then
53                         SRCOBJ=".libs/${SRCOBJ}"
54                 fi
55                 OBJS="${OBJS} ${DIR}/${SRCOBJ}"
56         fi
57 done
58
59 # Run dtrace -G over the temporary objects
60 ${DTRACE} -G ${DTRACEFLAGS} -s "${PROV}" -o "${OBJ}" ${OBJS} || exit
61
62 # Update the archives with the temporary, modified object files so that they are linked in
63 for FILE in ${FILES}; do
64         if echo "${FILE}" | grep .la > /dev/null; then
65                 LIBDIR=`dirname ${FILE}`
66                 LIB=".libs/`basename ${FILE} .la`.a"
67                 DIR="${TMPDIR}/`basename ${FILE}`"
68                 (cd "${DIR}" && ${AR} r "../../${LIBDIR}/${LIB}" *.o)
69         fi
70         # .lo files were modified in-place
71 done
72
73 rm -rf "${TMPDIR}"
74