Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!news.rmit.EDU.AU!goanna.cs.rmit.edu.au!news.apana.org.au!cantor.edge.net.au!news.teragen.com.au!news.access.net.au!news.mel.connect.com.au!news.mel.aone.net.au!grumpy.fl.net.au!news.webspan.net!newsfeeds.sol.net!news.maxwell.syr.edu!cpk-news-hub1.bbnplanet.com!news.bbnplanet.com!rill.news.pipex.net!pipex!dispatch.news.demon.net!demon!fido.news.demon.net!demon!sun4nl!wins.uva.nl!not-for-mail From: frank@wins.uva.nl (Frank van der Linden) Newsgroups: comp.unix.bsd.netbsd.misc Subject: Re: i386 netbsd 1.1, ELF, and Linux Date: 8 Mar 1997 14:30:53 +0100 Organization: FWINS, University of Amsterdam Distribution: world Message-ID: <5frpmd$2ql@mail.wins.uva.nl> References: <331FDC81.159D@us.oracle.com> <5fp18e$69v@mail.wins.uva.nl> <5fqr22$9f@vixen.cso.uiuc.edu> NNTP-Posting-Host: mail.wins.uva.nl Lines: 110 Xref: euryale.cc.adfa.oz.au comp.unix.bsd.netbsd.misc:5580 haszlaki@students.uiuc.edu (eric richard haszlakiewicz) writes: > hmm.. in a similar excersize, I'm running 1.2-current and >trying to run xquake. I have COMPAT_LINUX, EXEC_ELF32 on, and SVR4 off. >Same problem. Anyone know how to get it to work? Or if not, why it >doesn't work? I've heard about several people who did get it to run (and so did I, but I threw away all the binaries again). You may be missing the right dynamic linker, or have it in the wrong place (ld-linux.so.1). You could try to run the following program, and check if you have the interpreter it finds in the binary installed. If you're getting 'bad system call' messages, try compiling a kernel with KTRACE, use ktrace/kdump, and send me the output of that. - Frank #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <sys/exec_elf.h> int main(int argc, char **argv) { int fd, i; char *interp, *note; Elf32_Ehdr hdr; Elf32_Phdr ph; off_t pos; int namesz, descsz, type; if (argc != 2) { fprintf(stderr, "Usage: elfdump <file>\n"); exit(1); } if ((fd = open(argv[1], O_RDONLY)) < 0) { perror(argv[1]); exit(1); } if (read(fd, &hdr, sizeof hdr) < sizeof hdr || strncmp(hdr.e_ident, Elf32_e_ident, Elf32_e_siz)) { fprintf(stderr, "%s: not an ELF binary.\n"); exit(1); } printf("file type: %d\n", hdr.e_type); printf("machine type: %d\n", hdr.e_machine); printf("version: %d\n", hdr.e_version); printf("program header offset: %x\n", hdr.e_phoff); printf("section header offset: %x\n", hdr.e_shoff); printf("processor flags: %x\n", hdr.e_flags); printf("entry: %x\n", hdr.e_entry); if (lseek(fd, hdr.e_phoff, SEEK_SET) < 0) { perror("lseek"); exit(1); } for (i = 0; i < hdr.e_phnum; i++) { if (read(fd, &ph, sizeof ph) < sizeof ph) { fprintf(stderr, "I/O error examining ELF sections.\n"); exit(1); } if (ph.p_type == Elf_pt_interp) { pos = lseek(fd, 0, SEEK_CUR); interp = (char *) malloc(ph.p_filesz); if (lseek(fd, ph.p_offset, SEEK_SET) < 0) { perror("lseek"); exit(1); } read(fd, interp, ph.p_filesz); lseek(fd, pos, SEEK_SET); printf("interpreter: %s\n", interp); continue; } if (ph.p_type == Elf_pt_load) { printf("loadable section: %x (prot %x)\n", ph.p_vaddr, ph.p_flags); continue; } if (ph.p_type == Elf_pt_phdr) { printf("program header: %x \n", ph.p_vaddr); continue; } if (ph.p_type == Elf_pt_note) { pos = lseek(fd, 0, SEEK_CUR); if (lseek(fd, ph.p_offset, SEEK_SET) < 0) { perror("lseek"); exit(1); } read(fd, &namesz, 4); read(fd, &descsz, 4); read(fd, &type, 4); note = (char *)malloc(ph.p_filesz); read(fd, note, ph.p_filesz); lseek(fd, pos, SEEK_SET); printf("note section found, length %d type %d: \"%s\"\n", namesz - 1, type, note); } } return 0; }