summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkurt <kurt@openbsd.org>2008-06-25 02:51:08 +0000
committerkurt <kurt@openbsd.org>2008-06-25 02:51:08 +0000
commite8eadb942bf67a8de7b27d480984f597902efa68 (patch)
treec0a3791e685be377e416a5dd01e857c851e3f52e
parentBuild pic versions of crt0, crtbegin & crtend for amd64, i386, powerpc, (diff)
downloadwireguard-openbsd-e8eadb942bf67a8de7b27d480984f597902efa68.tar.xz
wireguard-openbsd-e8eadb942bf67a8de7b27d480984f597902efa68.zip
Make ldd grok pie binaries.
-rw-r--r--libexec/ld.so/ldd/ldd.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/libexec/ld.so/ldd/ldd.c b/libexec/ld.so/ldd/ldd.c
index eac4a7d0eba..bccc9b7a9e8 100644
--- a/libexec/ld.so/ldd/ldd.c
+++ b/libexec/ld.so/ldd/ldd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ldd.c,v 1.12 2007/05/29 04:47:17 jason Exp $ */
+/* $OpenBSD: ldd.c,v 1.13 2008/06/25 02:51:08 kurt Exp $ */
/*
* Copyright (c) 2001 Artur Grabowski <art@openbsd.org>
* All rights reserved.
@@ -94,11 +94,10 @@ doit(char *name)
{
Elf_Ehdr ehdr;
Elf_Phdr *phdr;
- int fd, i, size, status;
+ int fd, i, size, status, interp=0;
char buf[MAXPATHLEN];
void * dlhandle;
-
if ((fd = open(name, O_RDONLY)) < 0) {
warn("%s", name);
return 1;
@@ -117,7 +116,24 @@ doit(char *name)
return 1;
}
- if (ehdr.e_type == ET_DYN) {
+ size = ehdr.e_phnum * sizeof(Elf_Phdr);
+ if ((phdr = malloc(size)) == NULL)
+ err(1, "malloc");
+
+ if (pread(fd, phdr, size, ehdr.e_phoff) != size) {
+ warn("read(%s)", name);
+ close(fd);
+ free(phdr);
+ return 1;
+ }
+
+ for (i = 0; i < ehdr.e_phnum; i++)
+ if (phdr[i].p_type == PT_INTERP) {
+ interp = 1;
+ break;
+ }
+
+ if (ehdr.e_type == ET_DYN && !interp) {
printf("%s:\n", name);
if (realpath(name, buf) == NULL) {
warn("realpath(%s)", name);
@@ -129,22 +145,10 @@ doit(char *name)
return 1;
}
close(fd);
+ free(phdr);
return 0;
}
- size = ehdr.e_phnum * sizeof(Elf_Phdr);
- if ((phdr = malloc(size)) == NULL)
- err(1, "malloc");
-
- if (pread(fd, phdr, size, ehdr.e_phoff) != size) {
- warn("read(%s)", name);
- close(fd);
- free(phdr);
- return 1;
- }
- for (i = 0; i < ehdr.e_phnum; i++)
- if (phdr[i].p_type == PT_DYNAMIC)
- break;
close(fd);
free(phdr);