Add back support for SYSV binaries. Those are nasty since
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 1 Jun 2005 16:51:46 +0000 (16:51 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 1 Jun 2005 16:51:46 +0000 (16:51 +0000)
ELFOSABI_NONE == ELFOSABI_SYSV, but doing another loop to
handle them doesn't hurt much, since it's not the critical path
anyway.

sys/emulation/svr4/svr4_sysvec.c
sys/kern/imgact_elf.c

index 989936a..3a5d07b 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/svr4/svr4_sysvec.c,v 1.10.2.2 2002/07/09 14:12:43 robert Exp $
- * $DragonFly: src/sys/emulation/svr4/Attic/svr4_sysvec.c,v 1.12 2005/05/31 17:45:20 joerg Exp $
+ * $DragonFly: src/sys/emulation/svr4/Attic/svr4_sysvec.c,v 1.13 2005/06/01 16:51:46 joerg Exp $
  */
 
 /* XXX we use functions that might not exist. */
@@ -190,7 +190,7 @@ struct sysentvec svr4_sysvec = {
 Elf32_Brandinfo svr4_brand = {
   ELFOSABI_SYSV,
   "SVR4",
-  NULL,
+  NULL, /* Keep this, otherwise SYSV binaries are undetectable! */
   "/compat/svr4",
   "/lib/libc.so.1",
   &svr4_sysvec
index 34985e3..882f20e 100644 (file)
@@ -27,7 +27,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/imgact_elf.c,v 1.73.2.13 2002/12/28 19:49:41 dillon Exp $
- * $DragonFly: src/sys/kern/imgact_elf.c,v 1.27 2005/05/31 17:45:19 joerg Exp $
+ * $DragonFly: src/sys/kern/imgact_elf.c,v 1.28 2005/06/01 16:51:46 joerg Exp $
  */
 
 #include <sys/param.h>
@@ -720,6 +720,25 @@ exec_elf_imgact(struct image_params *imgp)
                }
        }
 
+       /*
+        * ELFOSABI_NONE == ELFOSABI_SYSV, so a SYSV binary misses all
+        * checks so far, since it is neither branded nor does it have
+        * an ABI note.  If the EI_OSABI field is ELFOSABI_NONE, assume
+        * it is svr4 and look for an entry in the elf_brand_list with
+        * match_abi_note == NULL.
+        */
+       if (brand_info == NULL && hdr->e_ident[EI_OSABI] == ELFOSABI_NONE) {
+               for (i = 0; i < MAX_BRANDS; i++) {
+                       Elf_Brandinfo *bi = elf_brand_list[i];
+
+                       if (bi != NULL && bi->match_abi_note == NULL &&
+                           ELFOSABI_SYSV == bi->brand) {
+                               brand_info = bi;
+                               break;
+                       }
+               }
+       }
+
        /* Lacking a recognized ABI, search for a recognized interpreter. */
        if (brand_info == NULL && interp != NULL) {
                for (i = 0;  i < MAX_BRANDS;  i++) {