Date: Wed, 6 Feb 2002 04:03:57 +0100 From: Bjoern Fischer <bfischer@Techfak.Uni-Bielefeld.DE> To: John Polstra <jdp@polstra.com> Cc: hackers@FreeBSD.ORG Subject: [patch] using ldd on shared libraries Message-ID: <20020206030357.GB2162@frolic.no-support.loc> In-Reply-To: <20020202125107.GA481@frolic.no-support.loc> References: <20020201201018.GB2992@frolic.no-support.loc> <20020201212028.GC2992@frolic.no-support.loc> <200202020424.g124OXD03238@vashon.polstra.com> <20020202125107.GA481@frolic.no-support.loc>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hello John,
I had to closer look into shared objects wrt self-containedness.
Here is a patch for ldd(1), that extends it to be used w/ shared
libraries, too. The patch probably needs some cleanup, but it works.
ldd-stub should be in /usr/libexec. Is /usr/libexec/elf preferable?
Do you have an idea how to generate an ldd-stub without a DT_NEEDED
for libc.so (and still working with ldd, of course)?
-Björn
[-- Attachment #2 --]
--- ldd.c 2002/02/06 02:17:46 1.1
+++ ldd.c 2002/02/06 02:39:49
@@ -42,6 +42,8 @@
#include <stdlib.h>
#include <unistd.h>
+#define LDD_STUB "/usr/libexec/ldd-stub"
+
extern void dump_file __P((const char *));
extern int error_count;
@@ -116,6 +118,9 @@
int n;
int status;
int file_ok;
+ int shared_object;
+
+ shared_object = 0;
if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
warn("%s", *argv);
@@ -152,6 +157,10 @@
warnx("%s: can't read program header", *argv);
file_ok = 0;
} else {
+ if (ehdr.e_type == ET_DYN) {
+ shared_object = 1;
+ dynamic = 1;
+ } else { /* need to fix white spaces */
for (i = 0; i < ehdr.e_phnum; i++) {
if (read(fd, &phdr, ehdr.e_phentsize)
!= sizeof phdr) {
@@ -163,6 +172,7 @@
if (phdr.p_type == PT_DYNAMIC)
dynamic = 1;
}
+ }
}
if (!dynamic) {
warnx("%s: not a dynamic executable", *argv);
@@ -204,7 +214,11 @@
}
break;
case 0:
- rval |= execl(*argv, *argv, NULL) != 0;
+ if (shared_object) {
+ setenv("LD_PRELOAD", *argv, 1);
+ rval |= execl(LDD_STUB, LDD_STUB, NULL) != 0;
+ } else
+ rval |= execl(*argv, *argv, NULL) != 0;
warn("%s", *argv);
_exit(1);
}
[-- Attachment #3 --]
int main(int argc, char *argv[]) { }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020206030357.GB2162>
