summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/ld
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1998-05-01 08:40:11 +0000
committerdfr <dfr@FreeBSD.org>1998-05-01 08:40:11 +0000
commitf28fdede6f2d2cb5aafec030913ea5ac7ad6eaed (patch)
tree2bf3b75648ce5b5bc8ca8eef5254d750a9052ae3 /gnu/usr.bin/ld
parentac67dd4e68c1d174836e84ce2b9e319b1230f8ac (diff)
downloadFreeBSD-src-f28fdede6f2d2cb5aafec030913ea5ac7ad6eaed.zip
FreeBSD-src-f28fdede6f2d2cb5aafec030913ea5ac7ad6eaed.tar.gz
Add ELF support.
Diffstat (limited to 'gnu/usr.bin/ld')
-rw-r--r--gnu/usr.bin/ld/ldd/ldd.c61
-rw-r--r--gnu/usr.bin/ld/ldd/sods.c12
2 files changed, 62 insertions, 11 deletions
diff --git a/gnu/usr.bin/ld/ldd/ldd.c b/gnu/usr.bin/ld/ldd/ldd.c
index d940261..31a7a67 100644
--- a/gnu/usr.bin/ld/ldd/ldd.c
+++ b/gnu/usr.bin/ld/ldd/ldd.c
@@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: ldd.c,v 1.13 1997/02/22 15:46:43 peter Exp $
+ * $Id: ldd.c,v 1.14 1997/09/02 21:54:39 jdp Exp $
*/
#include <sys/types.h>
@@ -37,6 +37,7 @@
#include <sys/resource.h>
#include <sys/wait.h>
#include <a.out.h>
+#include <elf.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
@@ -118,19 +119,61 @@ char *argv[];
argv++;
continue;
}
- if (read(fd, &hdr, sizeof hdr) != sizeof hdr
- || (N_GETFLAG(hdr) & EX_DPMASK) != EX_DYNAMIC
-#if 1 /* Compatibility */
- || hdr.a_entry < __LDPGSZ
-#endif
- ) {
-
- warnx("%s: not a dynamic executable", *argv);
+ if (read(fd, &hdr, sizeof hdr) != sizeof hdr) {
+ warnx("%s: can't read program header", *argv);
(void)close(fd);
rval |= 1;
argv++;
continue;
}
+
+ if (!N_BADMAG(hdr)) {
+ /* a.out file */
+ if ((N_GETFLAG(hdr) & EX_DPMASK) != EX_DYNAMIC
+#if 1 /* Compatibility */
+ || hdr.a_entry < __LDPGSZ
+#endif
+ ) {
+ warnx("%s: not a dynamic executable", *argv);
+ (void)close(fd);
+ rval |= 1;
+ argv++;
+ continue;
+ }
+ } else if (IS_ELF(*(Elf32_Ehdr*)&hdr)) {
+ Elf32_Ehdr ehdr;
+ Elf32_Phdr phdr;
+ int dynamic = 0, i;
+
+ lseek(fd, 0, SEEK_SET);
+ if (read(fd, &ehdr, sizeof ehdr) != sizeof ehdr) {
+ warnx("%s: can't read program header", *argv);
+ (void)close(fd);
+ rval |= 1;
+ argv++;
+ continue;
+ }
+ lseek(fd, 0, ehdr.e_phoff);
+ for (i = 0; i < ehdr.e_phnum; i++) {
+ if (read(fd, &phdr, ehdr.e_phentsize)
+ != sizeof phdr) {
+ warnx("%s: can't read program header", *argv);
+ (void)close(fd);
+ rval |= 1;
+ argv++;
+ continue;
+ }
+ if (phdr.p_type == PT_DYNAMIC)
+ dynamic = 1;
+ }
+ if (!dynamic) {
+ warnx("%s: not a dynamic executable", *argv);
+ (void)close(fd);
+ rval |= 1;
+ argv++;
+ continue;
+ }
+ }
(void)close(fd);
setenv("LD_TRACE_LOADED_OBJECTS_PROGNAME", *argv, 1);
diff --git a/gnu/usr.bin/ld/ldd/sods.c b/gnu/usr.bin/ld/ldd/sods.c
index 3e28746..801cca0 100644
--- a/gnu/usr.bin/ld/ldd/sods.c
+++ b/gnu/usr.bin/ld/ldd/sods.c
@@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: sods.c,v 1.5 1997/09/02 21:54:39 jdp Exp $
+ * $Id: sods.c,v 1.6 1997/11/28 19:34:27 jdp Exp $
*/
#include <assert.h>
@@ -39,6 +39,7 @@
#include <sys/stat.h>
#include <a.out.h>
+#include <elf.h>
#include <link.h>
#include <stab.h>
@@ -173,6 +174,13 @@ dump_file(const char *fname)
file_base = (const char *) objbase; /* Makes address arithmetic easier */
+ if (IS_ELF(*(Elf32_Ehdr*) file_base)) {
+ error("%s: this is an ELF program; use objdump to examine.", fname);
+ munmap(objbase, sb.st_size);
+ close(fd);
+ return;
+ }
+
ex = (const struct exec *) file_base;
printf("%s: a_midmag = 0x%lx\n", fname, ex->a_midmag);
@@ -211,7 +219,7 @@ dump_file(const char *fname)
}
printf(" Entry = 0x%lx\n", ex->a_entry);
- printf(" Text offset = %x, address = %x\n", N_TXTOFF(*ex),
+ printf(" Text offset = %x, address = %lx\n", N_TXTOFF(*ex),
N_TXTADDR(*ex));
printf(" Data offset = %lx, address = %lx\n", N_DATOFF(*ex),
N_DATADDR(*ex));
OpenPOWER on IntegriCloud