maint: update copyright
[gnulib.git] / m4 / ldd.m4
1 # ldd.m4 serial 1
2 dnl Copyright (C) 2006, 2009-2014 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 # Sets LDDPROG to a command and LDDPOSTPROC to a filter command, such that
8 #   $LDDPROG program $LDDPOSTPROC
9 # outputs a whitespace-separated list of the dynamically linked dependencies
10 # of the program, as library names (no full pathnames), or nothing if the
11 # program is statically linked or if the service is not supported on the given
12 # system.
13
14 dnl From Bruno Haible.
15
16 AC_DEFUN([gl_LDD],
17 [
18   AC_REQUIRE([AC_CANONICAL_HOST])
19   AC_REQUIRE([AC_PROG_CC])
20   dnl Default values.
21   LDDPROG=':'
22   LDDPOSTPROC=
23   dnl First try objdump, since it works when cross-compiling.
24   AC_CHECK_TOOL([OBJDUMP], [objdump], [false])
25 changequote(,)dnl
26   if test "$OBJDUMP" != "false"; then
27     LDDPROG="$OBJDUMP -p"
28     dnl The output of "LC_ALL=C objdump -p program" of a program or library
29     dnl looks like this:
30     dnl
31     dnl libnet.so:     file format elf32-i386
32     dnl
33     dnl Program Header:
34     dnl     LOAD off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
35     dnl          filesz 0x0001391d memsz 0x0001391d flags r-x
36     dnl     LOAD off    0x00013920 vaddr 0x00014920 paddr 0x00014920 align 2**12
37     dnl          filesz 0x00001874 memsz 0x0001b020 flags rw-
38     dnl  DYNAMIC off    0x00015104 vaddr 0x00016104 paddr 0x00016104 align 2**2
39     dnl          filesz 0x00000090 memsz 0x00000090 flags rw-
40     dnl
41     dnl Dynamic Section:
42     dnl   NEEDED      libroot.so
43     dnl   SONAME      libnet.so
44     dnl   SYMBOLIC    0x0
45     dnl   INIT        0x2aec
46     dnl   FINI        0x12a2c
47     dnl   HASH        0x94
48     dnl   STRTAB      0x1684
49     dnl   SYMTAB      0x774
50     dnl   STRSZ       0xbd5
51     dnl   SYMENT      0x10
52     dnl   PLTGOT      0x15f20
53     dnl   PLTRELSZ    0x320
54     dnl   PLTREL      0x11
55     dnl   JMPREL      0x27cc
56     dnl   REL         0x225c
57     dnl   RELSZ       0x570
58     dnl   RELENT      0x8
59     LDDPOSTPROC="2>/dev/null | sed -n -e 's,^  NEEDED *\\([^ ].*\\)\$,\\1,p'"
60   else
61     if test "$cross_compiling" = no; then
62       dnl Not cross-compiling. Try system dependent vendor tools.
63       case "$host_os" in
64         aix*)
65           LDDPROG="dump -H"
66           dnl The output of "LC_ALL=C dump -H program" looks like this:
67           dnl
68           dnl program:
69           dnl
70           dnl                         ***Loader Section***
71           dnl                       Loader Header Information
72           dnl VERSION#         #SYMtableENT     #RELOCent        LENidSTR
73           dnl 0x00000001       0x00000005       0x0000000d       0x0000001e
74           dnl
75           dnl #IMPfilID        OFFidSTR         LENstrTBL        OFFstrTBL
76           dnl 0x00000002       0x00000134       0x0000000d       0x00000152
77           dnl
78           dnl
79           dnl                         ***Import File Strings***
80           dnl INDEX  PATH                          BASE                MEMBER
81           dnl 0      /usr/lib:/lib
82           dnl 1                                    libc.a              shr.o
83           dnl
84           LDDPOSTPROC="2>/dev/null | sed -e '/^[^0-9]/d' -e '/^0x/d' | sed -n -e 's,^[0-9]*         *\\([^      ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
85           ;;
86         darwin*)
87           LDDPROG="otool -L"
88           dnl The output of "otool -L program" looks like this:
89           dnl program:
90           dnl         /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 71.1.4)
91           LDDPOSTPROC="2>/dev/null | sed -n -e 's,^     \\([^   ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
92           ;;
93         hpux*)
94           LDDPROG="chatr"
95           dnl The output of "LC_ALL=C chatr program" looks like this:
96           dnl program:
97           dnl          shared executable
98           dnl          shared library dynamic path search:
99           dnl              SHLIB_PATH     disabled  second
100           dnl              embedded path  disabled  first  Not Defined
101           dnl          shared library list:
102           dnl              dynamic   /usr/lib/libc.2
103           dnl          shared library binding:
104           dnl              deferred
105           dnl          global hash table disabled
106           dnl          plabel caching disabled
107           dnl          global hash array size:1103
108           dnl          global hash array nbuckets:3
109           dnl          shared vtable support disabled
110           dnl          static branch prediction disabled
111           dnl          executable from stack: D (default)
112           dnl          kernel assisted branch prediction enabled
113           dnl          lazy swap allocation disabled
114           dnl          text segment locking disabled
115           dnl          data segment locking disabled
116           dnl          third quadrant private data space disabled
117           dnl          fourth quadrant private data space disabled
118           dnl          third quadrant global data space disabled
119           dnl          data page size: D (default)
120           dnl          instruction page size: D (default)
121           dnl          nulptr references disabled
122           dnl          shared library private mapping disabled
123           dnl          shared library text merging disabled
124           dnl
125           dnl or like this:
126           dnl a.out:
127           dnl          32-bit ELF executable
128           dnl          shared library dynamic path search:
129           dnl              LD_LIBRARY_PATH    enabled  first
130           dnl              SHLIB_PATH         enabled  second
131           dnl              embedded path      enabled  third  /usr/lib/hpux32:/opt/langtools/lib/hpux32
132           dnl          shared library list:
133           dnl              libc.so.1
134           dnl          shared library binding:
135           dnl              deferred
136           dnl          global hash table disabled
137           dnl          global hash table size 1103
138           dnl          shared library mapped private disabled
139           dnl          shared library segment merging disabled
140           dnl          shared vtable support disabled
141           dnl          explicit unloading disabled
142           dnl          segments:
143           dnl              index type     address      flags size
144           dnl                  7 text     04000000     z---c-    D (default)
145           dnl                  8 data     40000000     ---m--    D (default)
146           dnl          executable from stack: D (default)
147           dnl          kernel assisted branch prediction enabled
148           dnl          lazy swap allocation for dynamic segments disabled
149           dnl          nulptr references disabled
150           dnl          address space model: default
151           dnl          caliper dynamic instrumentation disabled
152           dnl
153           LDDPOSTPROC="2>/dev/null | sed -e '1,/shared library list:/d' -e '/shared library binding:/,\$d' | sed -e 's,^.*[     ]\\([^  ][^     ]*\\)\$,\\1,' | sed -e 's,^.*/,,'"
154           ;;
155         irix*)
156           LDDPROG="elfdump -Dl"
157           dnl The output of "elfdump -Dl program" looks like this:
158           dnl
159           dnl program:
160           dnl
161           dnl                    **** MIPS LIBLIST INFORMATION ****
162           dnl .liblist :
163           dnl [INDEX] Timestamp               Checksum        Flags   Name            Version
164           dnl [1]     Oct  2 05:19:12 1999    0x867bf7a8      -----   libc.so.1       sgi1.0
165           dnl
166           LDDPOSTPROC="2>/dev/null | sed -n -e 's,^[[][0-9]*[]].*       0x[^    ]*      [^      ][^     ]*      \\([^   ][^     ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
167           ;;
168         linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) # glibc-based systems
169           LDDPROG="ldd"
170           dnl The output of "ldd program" looks like this:
171           dnl         libc.so.6 => /lib/libc.so.6 (0x4002d000)
172           dnl         /lib/ld-linux.so.2 (0x40000000)
173           LDDPOSTPROC="2>/dev/null | sed -n -e 's,^     \\([^   ][^     ]*\\).*\$,\\1,p' | sed -e 's,^.*/,,'"
174           ;;
175         osf*)
176           LDDPROG="odump -Dl"
177           dnl The output of "odump -Dl program" looks like this:
178           dnl
179           dnl                         ***LIBRARY LIST SECTION***
180           dnl         Name             Time-Stamp        CheckSum   Flags Version
181           dnl program:
182           dnl         libc.so      Dec 30 00:09:30 1997 0x5e955f9b     0 osf.1
183           dnl
184           LDDPOSTPROC="2>/dev/null | sed -n -e 's,^     \\([^   ][^     ]*\\).*,\\1,p' | sed -e '/^Name\$/d' | sed -e 's,^.*/,,'"
185           ;;
186         solaris*)
187           LDDPROG="ldd"
188           dnl The output of "ldd program" looks like this:
189           dnl         libc.so.1 =>     /usr/lib/libc.so.1
190           dnl         libdl.so.1 =>    /usr/lib/libdl.so.1
191           dnl         /usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1
192           dnl The first sed collects the indented lines.
193           dnl The second sed extracts the left-hand part.
194           dnl The third sed removes directory specifications.
195           LDDPOSTPROC="2>/dev/null | sed -n -e 's,^     \\([^ ].*\\)\$,\\1,p' | sed -e 's, =>.*\$,,' | sed -e 's,^.*/,,'"
196           ;;
197       esac
198     fi
199   fi
200   dnl Avoid locale dependencies.
201   if test "$LDDPROG" != ":"; then
202     LDDPROG="LC_ALL=C $LDDPROG"
203   fi
204 changequote([,])dnl
205   AC_SUBST([LDDPROG])
206   AC_SUBST([LDDPOSTPROC])
207 ])