Commit Graph

55 Commits

Author SHA1 Message Date
Konstantin Belousov
7d20a08076 ldd: also use exec mode for -a
The -a option also requires passing specific environment variables to
instance of rtld doing tracing.

PR:	259069
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
2021-11-15 22:49:33 +02:00
Konstantin Belousov
2c7a6dad4d ldd: do not use dlopen(RTLD_TRACE) for dso when format is specified
Problem is that rtld cannot reliably access updated environment.
This was made more obvious by bfd4c875a1.  The application
environment can be in arbitrary state and place, system components
can observe it only during execve(2), or in case of rtld, right after
execve, when environment is still at know location and format.

Instead spawn ld-elf.so.1 in direct exec mode which can correctly read
all inherited updates to the environment.

PR:	259069
Reviewed by:	arichardson, jhb
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D32464
2021-10-21 03:09:14 +03:00
Konstantin Belousov
ca8c576d10 ldd: style
Reviewed by:	arichardson, jhb
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D32464
2021-10-21 03:09:03 +03:00
Konstantin Belousov
17fc43bc01 ldd: Remove non-functional -v option
It seems -v only worked for a.out.  Remove it, not even keeping the current
nop for compat.  Also remove more mentions of a.out format from the man
page.

Reviewed by:	dim, emaste
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D31708
2021-08-28 23:39:16 +03:00
John Baldwin
9d4104b214 Fix ldd to work with more ELF files.
- Use libelf to parse ELF data structures and remove code duplication
  for ELF32.

- Don't require the OSABI field to be set to the FreeBSD OSABI for
  shared libraries.  Both AArch64 and RISC-V leave it set to "none"
  and instead depend on the ABI tag note.  For ldd, this means falling
  back to walking the notes in PT_NOTE segments to find the ABI tag
  note to determine if an ELF shared library without OSABI set in the
  header file is a FreeBSD shared library.

Reviewed by:	kib
MFC after:	5 days
Sponsored by:	DARPA
Differential Revision:	https://reviews.freebsd.org/D28342
2021-01-29 10:53:50 -08:00
Ed Maste
c8eee7c0bf ldd: renumber executable type constants
ldd had #defines for AOUT, ELF, and ELF32.  The removal of AOUT left a
possibly confusing gap.  These are not used anywhere but this file so
renumber to avoid the gap.

Reported by:	allanjude
2021-01-09 13:34:58 -05:00
Ed Maste
0713c7b88c ldd: Retire aout support
Userland aout support has not been required since FreeBSD 2.x.
If someone needs to use FreeBSD 2 shared libraries they will be best
served by using a FreeBSD 2 ldd, perhaps as part of a jail with a full
FreeBSD 2.x install.

Relnotes:	Yes
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D27478
2021-01-07 19:14:01 -05:00
Konstantin Belousov
2b5d88fdcf Fix ldd for PIE binaries after rtld stopped accepting binaries for dlopen.
ldd proclaims ET_DYN objects as shared libraries and tries to
dlopen(RTLD_TRACE) them to get dependencies. Since PIE binaries are
ET_DYN | DF_1_PIE, refusal to dlopen such binaries breaks ldd.

Fix it by reading and parsing dynamic segment looking for DF_FLAG_1
and taking DF_1_PIE into account when deciding between binary and
library.

Reported by:	Dewayne Geraghty <dewayne@heuristicsystems.com.au>
Reviewed by:	markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D25257
2020-06-13 18:21:31 +00:00
Ed Maste
5a2c0ab18b ldd: add aout deprecation notice
Reported by:	kib
2020-03-17 16:42:25 +00:00
Pedro F. Giffuni
1de7b4b805 various: general adoption of SPDX licensing ID tags.
Mainly focus on files that use BSD 2-Clause license, however the tool I
was using misidentified many licenses so this was mostly a manual - error
prone - task.

The Software Package Data Exchange (SPDX) group provides a specification
to make it easier for automated tools to detect and summarize well known
opensource licenses. We are gradually adopting the specification, noting
that the tags are considered only advisory and do not, in any way,
superceed or replace the license texts.

No functional change intended.
2017-11-27 15:37:16 +00:00
Ruslan Bukin
ca20f8ec29 o Replace __riscv__ with __riscv
o Replace __riscv64 with (__riscv && __riscv_xlen == 64)

This is required to support new GCC 7.1 compiler.
This is compatible with current GCC 6.1 compiler.

RISC-V is extensible ISA and the idea here is to have built-in define
per each extension, so together with __riscv we will have some subset
of these as well (depending on -march string passed to compiler):

__riscv_compressed
__riscv_atomic
__riscv_mul
__riscv_div
__riscv_muldiv
__riscv_fdiv
__riscv_fsqrt
__riscv_float_abi_soft
__riscv_float_abi_single
__riscv_float_abi_double
__riscv_cmodel_medlow
__riscv_cmodel_medany
__riscv_cmodel_pic
__riscv_xlen

Reviewed by:	ngie
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D11901
2017-08-07 14:09:57 +00:00
Don Lewis
4b426307e5 Increase size of argv[] array to avoid running off the end.
Reported by:	Coverity
CID:		1193819
MFC after:	1 week
2016-05-16 16:01:46 +00:00
Ruslan Bukin
5a0bf0f5c6 We don't support a.out executables on RISC-V.
Reviewed by:	emaste
Sponsored by:	DARPA, AFRL
Sponsored by:	HEIF5
Differential Revision:	https://reviews.freebsd.org/D5048
2016-01-24 15:15:57 +00:00
Jung-uk Kim
a41dab8fc9 Add support for ARM EABI.
MFC after:	1 week
2015-10-16 17:50:36 +00:00
Andrew Turner
e1f65999b6 Allowus to exclude a.out support from ldd and use it with arm64 as it won't
support the a.out format.

Reviewed by:	emaste
Sponsored by:	The FreeBSD Foundation
2015-03-18 13:59:04 +00:00
Mark Johnston
a94a4b74bd Pass variables prefixed with both LD_ and LD_32_ to the run-time linker.
This prevents unintentional execution of programs when running ldd(1) on
32-bit Linux binaries.

PR:		175339, 127276
Suggested by:	kib, rstone
Reviewed by:	kib
MFC after:	2 weeks
2013-08-07 00:28:17 +00:00
Rebecca Cran
70557f4f83 hdr.elf.e_ident[EI_OSABI] is not a bitmask so '==' should been used.
Reported by: Artem Belevich <fbsdlist at src.cx>
2010-11-22 20:18:46 +00:00
John Baldwin
52122f3139 A few style and whitespace fixes.
Submitted by:	bde
2008-08-02 12:04:59 +00:00
John Baldwin
e68ed79390 Tweak the support for using ldd on 32-bit objects a bit further.
Specifically, build a 32-bit /usr/bin/ldd32 on amd64 which handles 32-bit
objects.  Since it is a 32-bit binary, it can fork a child process which
can dlopen() a 32-bit shared library.  The current 32-bit support in ldd
can't do this because it does the dlopen() from a 64-bit process.  In order
to preserve an intuitive interface for users, the ldd binary automatically
execs /usr/bin/ldd32 for 32-bit objects.  The end result is that ldd on
amd64 now transparently handles 32-bit shared libraries in addition to
32-bit binaries.

Submitted by:	ps (indirectly)
2008-08-01 21:52:41 +00:00
Edwin Groothuis
bff7135050 Fix text in the comment why we check for ELF32_R_TYPE
Approved by:	bde@
MFC after:	2 days2 days
2008-07-28 12:49:16 +00:00
Edwin Groothuis
8bd833fff8 After the commit of SVN rev 180236, wilko@ noticed that the approach
doesn't work on the Alpha platform: machine/elf.h doesn't include
sys/elf32.h there.

PR:		related to bin/124906
Approved by:	bde@
MFC after:	1 week
2008-07-21 02:13:14 +00:00
Edwin Groothuis
fffd993df2 On 64 bit architectures, you can run 32 bit executables and the rtld can trace them, but ldd(1) doesn't know yet how to detect them:
[/] root@ed-exigent>ldd `which httpd`
    ldd: /usr/local/sbin/httpd: can't read program header
    ldd: /usr/local/sbin/httpd: not a dynamic executable

    But...

    [/] root@ed-exigent>LD_32_TRACE_LOADED_OBJECTS==1 `which httpd`
    libm.so.4 => /lib32//libm.so.4 (0x280c8000)
    libaprutil-1.so.2 => /usr/local/lib/libaprutil-1.so.2 (0x280de000)
    libexpat.so.6 => /usr/local/lib/libexpat.so.6 (0x280f2000)
    libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28110000)
    libapr-1.so.2 => /usr/local/lib/libapr-1.so.2 (0x281fd000)
    libcrypt.so.3 => /lib32//libcrypt.so.3 (0x2821d000)
    libpthread.so.2 => not found (0x0)
    libc.so.6 => /lib32//libc.so.6 (0x28235000)
    libpthread.so.2 => /usr/lib32/libpthread.so.2 (0x2830d000)

Added support in ldd(1) for the LD_32_xxx environment variables if
the architecture of the machine is >32 bits. If we ever go to 128
bit architectures this excercise will have to be repeated but thanks
to earlier commits today it will be relative simple.

PR:		bin/124906
Submitted by:	edwin
Approved by:	bde (mentor)
MFC after:	1 week
2008-07-03 22:37:51 +00:00
Edwin Groothuis
d3c1e14b41 Extract the determination of the kind of (dynamic) executable from
the main-loop into a seperate function.
Instead of using hardcoded environment variables, define them in a
lookup table.
For the rest, no functionality changes.

Approved by:	bde (mentor)
MFC after:	1 week
2008-07-03 22:30:18 +00:00
Edwin Groothuis
a0d476a986 stylify ldd.c, no functional changes.
Approved by:	bde (mentor)
MFC after:	1 week
2008-07-03 22:26:43 +00:00
Maxim Sobolev
d1cf9ea2c4 Fix a problem with RTLD_TRACE flag to dlopen(3), which sometimes can return
even if there was no error occured (when trying to dlopen(3) object that
already linked into executable which does dlopen(3) call). This is more
proper fix for `ldd /usr/lib/libc.so' problem, because the new behaviour
conforms to documentation.

Remove workaround from ldd.c (rev.1.32).

PR:		35099
Submitted by:	Nathan Hawkins <utsl@quic.net>
MFC after:	1 week
2002-10-19 10:18:29 +00:00
Akinori MUSHA
005ba515dc Fix a tiny bug in shlib support of ldd(1); if dlopen(lib, RTLD_TRACE)
returns, exit gracefully with 0.

This fixes the behavior you see when you specify libc.so.  It occurs
because ldd(1) itself is linked with libc.so.

	$ ldd /usr/lib/libc.so
	/usr/lib/libc.so:
	ldd: /usr/lib/libc.so: (null)
	/usr/lib/libc.so: exit status 1

Reviewed by:	silence of audit@
2002-05-17 17:06:56 +00:00
Mark Murray
a53809fd7e Warns; ANSIfy, constify and move declarations into a common header. 2002-04-28 12:55:35 +00:00
Mike Barcroft
a2cfdda8d7 Include <arpa/inet.h> for prototype of ntohl() used in the N_BADMAG()
macro.
2002-04-20 20:09:29 +00:00
Warner Losh
f1bb2cd2aa remove __P 2002-03-22 01:22:50 +00:00
David E. O'Brien
2024994319 Add support such that if LD_TRACE_LOADED_OBJECTS_ALL is defined to a
non-empty string in the environment; we indicate which objects caused
each object to be loaded.

PR:		30908
Submitted-by:	Mike Meyer <mwm@mired.org>
2002-02-17 07:04:32 +00:00
Maxim Sobolev
97b79abc86 Inspect ELF header and reject any non-FreeBSD shared objects.
MFC after:	2 weeks
2002-02-08 04:08:57 +00:00
Maxim Sobolev
c6de4ce791 Allow ldd(1) be used on shared libraries in addition to executables. 2002-02-04 10:33:48 +00:00
Maxim Sobolev
fc41545e4e GC meaningless assignment.
MFC after:	3 days
2002-02-04 10:23:23 +00:00
Brian Somers
7bc6d0158f Fix the type of the NULL arg to execl()
Idea from: Theo de Raadt <deraadt@openbsd.org>
2001-07-09 09:24:06 +00:00
David E. O'Brien
5e6220d9d0 * include/elf.h has been repo copied to include/elf-hints.h, and it no
longer includes machine/elf.h.
* consumers of elf.h now use the minimalist elf header possible.

This change is motivated by Binutils 2.11.0 and too much clashing over
our base elf headers and the Binutils elf headers.
2001-05-02 23:56:21 +00:00
Andrey A. Chernov
e6f0df2b20 Fix lseek args order (PR 23549)
Catch and report lseek errors too
While reading header don't attempt to continue reading
if some IO operation fails

PR:		23549
2000-12-15 13:20:43 +00:00
Philippe Charnier
3e7626264d Add rcsid. Remove unused #include. Remove error() definition and replace
with warn().
2000-12-10 20:54:13 +00:00
Warner Losh
62f882d620 getopt and friends are declared in <unistd.h>
getopt returns -1 not EOF.
2000-09-04 06:09:54 +00:00
Peter Wemm
c3aac50f28 $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
Doug Rabson
97db68b61b Make ldd work on alpha. 1998-09-16 09:31:48 +00:00
John Polstra
e2daa140cc Fix a bug which caused ldd to execute scripts listed on its command
line, instead of skipping them.

Also make a few minor cleanups.

PR:		bin/7783
1998-08-30 18:30:59 +00:00
Doug Rabson
c474c6d309 Add ELF support. 1998-05-01 08:40:11 +00:00
John Polstra
170fa4e888 Touch up the code that implements "ldd -v".
Bring the style of sods.c into better conformance.  Add code to
print the contents of each datum being relocated.  Correct the logic
that distinguishes between programs, shared libraries, and object
files.  Make the entire program "-Wall" clean.
1997-09-02 21:54:39 +00:00
Peter Wemm
fce15c9ab3 Revert $FreeBSD$ to $Id$ 1997-02-22 15:48:31 +00:00
Jordan K. Hubbard
1130b656e5 Make the long-awaited change from $Id$ to $FreeBSD$
This will make a number of things easier in the future, as well as (finally!)
avoiding the Id-smashing problem which has plagued developers for so long.

Boy, I'm glad we're not using sup anymore.  This update would have been
insane otherwise.
1997-01-14 07:20:47 +00:00
John Polstra
18c0f29eaa Set LD_TRACE_LOADED_OBJECTS to "1" instead of to "". The dynamic linker
now treats empty "LD_*" environment variables as if they were unset, per
the standard SVR4 conventions.
1997-01-12 00:10:57 +00:00
Bruce Evans
45f4c7f97c Made the synopsis in the man page conform to the style guide.
Made the usage message conform to the style guide.

Don't use the implementation variable `__progname'.
1996-11-30 16:12:46 +00:00
Peter Wemm
b988beb8f9 make the Usage string match reality
Submitted by:  faried nawaz <fn@uidaho.edu>, PR#2075
1996-11-22 13:58:03 +00:00
Peter Wemm
fecaa12727 oops, uninitialised variable.. -v mode depended on stack contents.
Submitted by: Masafumi NAKANE <max@wide.ad.jp>, PR#1920
1996-10-29 18:45:20 +00:00
Peter Wemm
9731d13765 Incorporate John Polstra's sods.c display of the details about the
dynamic linking information in the executable.  It's quite extensive.
It's connected to ldd's (new) -v option.
1996-10-01 02:16:16 +00:00