summaryrefslogblamecommitdiffstats
path: root/package/modutils/modutils-cross.patch
blob: c62f8860ad7c7ce874bcacf2d725d1d584087799 (plain) (tree)






















































































































































































































































                                                                                                                                  











































                                                                                   





















































                                                                     








                                                                         
































































































































                                                                                                




















                                                                                   




                                                                                   
 



















                                                    
 
      










                                         
       



                                                                               
diff -urN modutils-2.4.27.0.orig/depmod/depmod.c modutils-2.4.27.0/depmod/depmod.c
--- modutils-2.4.27.0.orig/depmod/depmod.c	2005-09-29 18:14:05.000000000 -0600
+++ modutils-2.4.27.0/depmod/depmod.c	2005-09-29 18:12:36.000000000 -0600
@@ -274,7 +274,6 @@
 
 extern int quick;	/* Option -A */
 
-
 /*
  *	Create a symbol definition.
  *	Add defined symbol to the head of the list of defined symbols.
@@ -556,6 +555,13 @@
 		if (!in_range(f, m_size, ref_pci, sizeof(pci_device_size)))
 			return;
 		memcpy(&pci_device_size, (char *)image + ref_pci - f->baseaddr, sizeof(pci_device_size));
+		if (byteswap==1) {
+		    if (sizeof(unsigned tgt_long) == 4) {
+			pci_device_size = bswap_32(pci_device_size);
+		    } else if (sizeof(unsigned tgt_long) == 8) {
+			pci_device_size = bswap_64(pci_device_size);
+		    }
+		}
 	}
 	else
 		pci_device_size = sizeof(pci_device);
@@ -573,6 +579,14 @@
 		memset(&pci_device, 0, sizeof(pci_device));
 		memcpy(&pci_device, (char *)image + ref_pci - f->baseaddr, pci_device_size);
 		ref_pci += pci_device_size;
+		if (byteswap==1) {
+		    pci_device.vendor = bswap_32(pci_device.vendor);
+		    pci_device.device = bswap_32(pci_device.device);
+		    pci_device.subvendor = bswap_32(pci_device.subvendor);
+		    pci_device.subdevice = bswap_32(pci_device.subdevice);
+		    pci_device.class = bswap_32(pci_device.class);
+		    pci_device.class_mask = bswap_32(pci_device.class_mask);
+		}
 		if (!pci_device.vendor)
 			break;
 		mod->pci_device = xrealloc(mod->pci_device, ++(mod->n_pci_device)*sizeof(*(mod->pci_device)));
@@ -594,6 +608,13 @@
 	if (!in_range(f, m_size, ref_isapnp, sizeof(isapnp_device_size)))
 		return;
 	memcpy(&isapnp_device_size, (char *)image + ref_isapnp - f->baseaddr, sizeof(isapnp_device_size));
+	if (byteswap==1) {
+	    if (sizeof(unsigned tgt_long) == 4) {
+		isapnp_device_size = bswap_32(isapnp_device_size);
+	    } else if (sizeof(unsigned tgt_long) == 8) {
+		isapnp_device_size = bswap_64(isapnp_device_size);
+	    }
+	}
 	ref_ref_isapnp = obj_symbol_final_value(f, obj_find_symbol(f, "__module_isapnp_device_table"));
 	if (!in_range(f, m_size, ref_ref_isapnp, sizeof(ref_isapnp)))
 		return;
@@ -608,6 +629,12 @@
 		memset(&isapnp_device, 0, sizeof(isapnp_device));
 		memcpy(&isapnp_device, (char *)image + ref_isapnp - f->baseaddr, isapnp_device_size);
 		ref_isapnp += isapnp_device_size;
+		if (byteswap==1) {
+		    isapnp_device.card_vendor = bswap_16(isapnp_device.card_vendor);
+		    isapnp_device.card_device = bswap_16(isapnp_device.card_device);
+		    isapnp_device.vendor = bswap_16(isapnp_device.vendor);
+		    isapnp_device.function = bswap_16(isapnp_device.function);
+		}
 		if (!isapnp_device.card_vendor)
 			break;
 		mod->isapnp_device = xrealloc(mod->isapnp_device, ++(mod->n_isapnp_device)*sizeof(*(mod->isapnp_device)));
@@ -629,6 +656,13 @@
 	if (!in_range(f, m_size, ref_isapnp, sizeof(isapnp_card_size)))
 		return;
 	memcpy(&isapnp_card_size, (char *)image + ref_isapnp - f->baseaddr, sizeof(isapnp_card_size));
+	if (byteswap==1) {
+	    if (sizeof(unsigned tgt_long) == 4) {
+		isapnp_card_size = bswap_32(isapnp_card_size);
+	    } else if (sizeof(unsigned tgt_long) == 8) {
+		isapnp_card_size = bswap_64(isapnp_card_size);
+	    }
+	}
 	ref_ref_isapnp = obj_symbol_final_value(f, obj_find_symbol(f, "__module_isapnp_card_table"));
 	if (!in_range(f, m_size, ref_ref_isapnp, sizeof(ref_isapnp)))
 		return;
@@ -642,6 +676,11 @@
 		memset(&isapnp_card, 0, sizeof(isapnp_card));
 		memcpy(&isapnp_card, (char *)image + ref_isapnp - f->baseaddr, isapnp_card_size);
 		ref_isapnp += isapnp_card_size;
+		if (byteswap==1) {
+		    isapnp_card.card_vendor = bswap_16(isapnp_card.card_vendor);
+		    isapnp_card.card_device = bswap_16(isapnp_card.card_device);
+		    // Fixme -- iterate over all devs fixing up vendor and function
+		}
 		if (!isapnp_card.card_vendor)
 			break;
 		mod->isapnp_card = xrealloc(mod->isapnp_card, ++(mod->n_isapnp_card)*sizeof(*(mod->isapnp_card)));
@@ -659,11 +698,25 @@
 	struct usb_device_id usb_device, *latest;
 	ElfW(Addr) ref_usb, ref_ref_usb;
 	unsigned tgt_long usb_device_size;
-	ref_usb = obj_symbol_final_value(f, obj_find_symbol(f, "__module_usb_device_size"));
+	struct obj_symbol *sym;
+	sym = obj_find_symbol(f, "__module_usb_device_size");
+	if (!sym)
+		return;
+	ref_usb = obj_symbol_final_value(f, sym);
 	if (!in_range(f, m_size, ref_usb, sizeof(usb_device_size)))
 		return;
 	memcpy(&usb_device_size, (char *)image + ref_usb - f->baseaddr, sizeof(usb_device_size));
-	ref_ref_usb = obj_symbol_final_value(f, obj_find_symbol(f, "__module_usb_device_table"));
+	if (byteswap==1) {
+	    if (sizeof(unsigned tgt_long) == 4) {
+		usb_device_size = bswap_32(usb_device_size);
+	    } else if (sizeof(unsigned tgt_long) == 8) {
+		usb_device_size = bswap_64(usb_device_size);
+	    }
+	}
+	sym = obj_find_symbol(f, "__module_usb_device_table");
+	if (!sym)
+		return;
+	ref_ref_usb = obj_symbol_final_value(f, sym);
 	if (!in_range(f, m_size, ref_ref_usb, sizeof(ref_usb)))
 		return;
 	memcpy(&ref_usb, (char *)image + ref_ref_usb - f->baseaddr, sizeof(ref_usb));
@@ -677,6 +730,13 @@
 		memset(&usb_device, 0, sizeof(usb_device));
 		memcpy(&usb_device, (char *)image + ref_usb - f->baseaddr, usb_device_size);
 		ref_usb += usb_device_size;
+		if (byteswap==1) {
+		    usb_device.match_flags = bswap_16(usb_device.match_flags);
+		    usb_device.idVendor = bswap_16(usb_device.idVendor);
+		    usb_device.idProduct = bswap_16(usb_device.idProduct);
+		    usb_device.bcdDevice_lo = bswap_16(usb_device.bcdDevice_lo);
+		    usb_device.bcdDevice_hi = bswap_16(usb_device.bcdDevice_hi);
+		}
 		if (!usb_device.idVendor && !usb_device.bDeviceClass &&
 		    !usb_device.bInterfaceClass && !usb_device.driver_info)
 		break;
@@ -699,6 +759,13 @@
 	if (!in_range(f, m_size, ref_parport, sizeof(parport_device_size)))
 		return;
 	memcpy(&parport_device_size, (char *)image + ref_parport - f->baseaddr, sizeof(parport_device_size));
+	if (byteswap==1) {
+	    if (sizeof(unsigned tgt_long) == 4) {
+		parport_device_size = bswap_32(parport_device_size);
+	    } else if (sizeof(unsigned tgt_long) == 8) {
+		parport_device_size = bswap_64(parport_device_size);
+	    }
+	}
 	ref_ref_parport = obj_symbol_final_value(f, obj_find_symbol(f, "__module_parport_device_table"));
 	if (!in_range(f, m_size, ref_ref_parport, sizeof(ref_parport)))
 		return;
@@ -713,6 +780,14 @@
 		memset(&parport_device, 0, sizeof(parport_device));
 		memcpy(&parport_device, (char *)image + ref_parport - f->baseaddr, parport_device_size);
 		ref_parport += parport_device_size;
+		if (byteswap==1) {
+#if ELFCLASSM == ELFCLASS32
+		    parport_device.pattern = bswap_32(parport_device.pattern);
+#endif
+#if ELFCLASSM == ELFCLASS64
+		    parport_device.pattern = bswap_64(parport_device.pattern);
+#endif
+		}
 		if (!parport_device.pattern)
 			break;
 		mod->parport_device = xrealloc(mod->parport_device, ++(mod->n_parport_device)*sizeof(*(mod->parport_device)));
@@ -737,6 +812,13 @@
 	if (!in_range(f, m_size, ref_pnpbios, sizeof(pnpbios_device_size)))
 		return;
 	memcpy(&pnpbios_device_size, (char *)image + ref_pnpbios - f->baseaddr, sizeof(pnpbios_device_size));
+	if (byteswap==1) {
+	    if (sizeof(unsigned tgt_long) == 4) {
+		pnpbios_device_size = bswap_32(pnpbios_device_size);
+	    } else if (sizeof(unsigned tgt_long) == 8) {
+		pnpbios_device_size = bswap_64(pnpbios_device_size);
+	    }
+	}
 	ref_ref_pnpbios = obj_symbol_final_value(f, obj_find_symbol(f, "__module_pnpbios_device_table"));
 	if (!in_range(f, m_size, ref_ref_pnpbios, sizeof(ref_pnpbios)))
 		return;
@@ -751,6 +833,9 @@
 		memset(&pnpbios_device, 0, sizeof(pnpbios_device));
 		memcpy(&pnpbios_device, (char *)image + ref_pnpbios - f->baseaddr, pnpbios_device_size);
 		ref_pnpbios += pnpbios_device_size;
+		//if (byteswap==1) {
+		    // looks like there is nothing to do here...
+		//}
 		if (!pnpbios_device.id[0])
 			break;
 		mod->pnpbios_device = xrealloc(mod->pnpbios_device, ++(mod->n_pnpbios_device)*sizeof(*(mod->pnpbios_device)));
@@ -772,6 +857,13 @@
 	if (!in_range(f, m_size, ref_ieee1394, sizeof(ieee1394_device_size)))
 		return;
 	memcpy(&ieee1394_device_size, (char *)image + ref_ieee1394 - f->baseaddr, sizeof(ieee1394_device_size));
+	if (byteswap==1) {
+	    if (sizeof(unsigned tgt_long) == 4) {
+		ieee1394_device_size = bswap_32(ieee1394_device_size);
+	    } else if (sizeof(unsigned tgt_long) == 8) {
+		ieee1394_device_size = bswap_64(ieee1394_device_size);
+	    }
+	}
 	ref_ref_ieee1394 = obj_symbol_final_value(f, obj_find_symbol(f, "__module_ieee1394_device_table"));
 	if (!in_range(f, m_size, ref_ref_ieee1394, sizeof(ref_ieee1394)))
 		return;
@@ -786,6 +878,13 @@
 		memset(&ieee1394_device, 0, sizeof(ieee1394_device));
 		memcpy(&ieee1394_device, (char *)image + ref_ieee1394 - f->baseaddr, ieee1394_device_size);
 		ref_ieee1394 += ieee1394_device_size;
+		if (byteswap==1) {
+		    ieee1394_device.match_flags = bswap_32(ieee1394_device.match_flags);
+		    ieee1394_device.vendor_id = bswap_32(ieee1394_device.vendor_id);
+		    ieee1394_device.model_id = bswap_32(ieee1394_device.model_id);
+		    ieee1394_device.specifier_id = bswap_32(ieee1394_device.specifier_id);
+		    ieee1394_device.version = bswap_32(ieee1394_device.version);
+		}
 		if (ieee1394_device.match_flags == 0)
 			break;
 		mod->ieee1394_device = xrealloc(mod->ieee1394_device, ++(mod->n_ieee1394_device)*sizeof(*(mod->ieee1394_device)));
diff -urN modutils-2.4.27.0.orig/include/obj.h modutils-2.4.27.0/include/obj.h
--- modutils-2.4.27.0.orig/include/obj.h	2003-10-26 19:34:46.000000000 -0700
+++ modutils-2.4.27.0/include/obj.h	2005-09-29 17:53:53.000000000 -0600
@@ -28,6 +28,8 @@
 
 #include <stdio.h>
 #include <sys/types.h>
+#include <endian.h>
+#include <byteswap.h>
 #include <elf.h>
 #include ELF_MACHINE_H
 #include "module.h"
@@ -299,4 +301,6 @@
 
 int obj_gpl_license(struct obj_file *, const char **);
 
+extern int byteswap;
+
 #endif /* obj.h */
diff -urN modutils-2.4.27.0.orig/obj/obj_common.c modutils-2.4.27.0/obj/obj_common.c
--- modutils-2.4.27.0.orig/obj/obj_common.c	2002-02-28 17:39:06.000000000 -0700
+++ modutils-2.4.27.0/obj/obj_common.c	2005-09-29 17:53:44.000000000 -0600
@@ -28,6 +28,8 @@
 #include <util.h>
 #include <module.h>
 
+int byteswap;
+
 /*======================================================================*/
 
 /* Standard ELF hash function.  */
diff -urN modutils-2.4.27.0.orig/util/modstat.c modutils-2.4.27.0/util/modstat.c
--- modutils-2.4.27.0.orig/util/modstat.c	2002-11-24 21:01:57.000000000 -0700
+++ modutils-2.4.27.0/util/modstat.c	2005-09-29 14:41:13.000000000 -0600
@@ -408,6 +408,7 @@
 
 int get_kernel_info(int type)
 {
+#if 0
 	k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL);
 
 #ifdef COMPAT_2_0
@@ -416,4 +417,7 @@
 #endif /* COMPAT_2_0 */
 
 	return new_get_kernel_info(type);
+#else
+	return 1;
+#endif
 }
--- modutils-2.4.27/obj/obj_ppc.c.orig	2005-10-24 11:54:44.000000000 -0600
+++ modutils-2.4.27/obj/obj_ppc.c	2005-10-24 11:55:54.000000000 -0600
@@ -20,6 +20,8 @@
    along with this program; if not, write to the Free Software Foundation,
    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
+#include <string.h>
+#include <stdlib.h>
 #include <stddef.h>
 #include <module.h>
 #include <obj.h>
@@ -255,7 +257,9 @@
   archdata_sec->header.sh_size = 0;
   sec = obj_find_section(f, "__ftr_fixup");
   if (sec) {
-    ad = (struct archdata *) (archdata_sec->contents) = xmalloc(sizeof(*ad));
+    struct archdata * ad;
+    archdata_sec->contents = xmalloc(sizeof(*ad));
+    ad = (struct archdata *) (archdata_sec->contents);
     memset(ad, 0, sizeof(*ad));
     archdata_sec->header.sh_size = sizeof(*ad);
     ad->__start___ftr_fixup = sec->header.sh_addr;
--- modutils-2.4.27/obj/obj_load.c.orig	2006-01-10 06:10:37.000000000 -0700
+++ modutils-2.4.27/obj/obj_load.c	2006-01-10 06:10:47.000000000 -0700
@@ -62,13 +62,61 @@
       error("%s is not an ELF file", filename);
       return NULL;
     }
+
+  /* Check if the target endianness matches the host's endianness */
+  byteswap = 0;
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+  if (f->header.e_ident[5] == ELFDATA2MSB) {
+      /* Ick -- we will have to byte-swap everything */
+      byteswap = 1;
+  }
+#elif __BYTE_ORDER == __BIG_ENDIAN
+  if (f->header.e_ident[5] == ELFDATA2LSB) {
+      byteswap = 1;
+  }
+#else
+#error Unknown host byte order!
+#endif
+  if (byteswap==1) {
+#if ELFCLASSM == ELFCLASS32
+	  f->header.e_type=bswap_16(f->header.e_type);
+	  f->header.e_machine=bswap_16(f->header.e_machine);
+	  f->header.e_version=bswap_32(f->header.e_version);
+	  f->header.e_entry=bswap_32(f->header.e_entry);
+	  f->header.e_phoff=bswap_32(f->header.e_phoff);
+	  f->header.e_shoff=bswap_32(f->header.e_shoff);
+	  f->header.e_flags=bswap_32(f->header.e_flags);
+	  f->header.e_ehsize=bswap_16(f->header.e_ehsize);
+	  f->header.e_phentsize=bswap_16(f->header.e_phentsize);
+	  f->header.e_phnum=bswap_16(f->header.e_phnum);
+	  f->header.e_shentsize=bswap_16(f->header.e_shentsize);
+	  f->header.e_shnum=bswap_16(f->header.e_shnum);
+	  f->header.e_shstrndx=bswap_16(f->header.e_shstrndx);
+#endif
+#if ELFCLASSM == ELFCLASS64
+	  f->header.e_type=bswap_32(f->header.e_type);
+	  f->header.e_machine=bswap_32(f->header.e_machine);
+	  f->header.e_version=bswap_64(f->header.e_version);
+	  f->header.e_entry=bswap_64(f->header.e_entry);
+	  f->header.e_phoff=bswap_64(f->header.e_phoff);
+	  f->header.e_shoff=bswap_64(f->header.e_shoff);
+	  f->header.e_flags=bswap_64(f->header.e_flags);
+	  f->header.e_ehsize=bswap_32(f->header.e_ehsize);
+	  f->header.e_phentsize=bswap_32(f->header.e_phentsize);
+	  f->header.e_phnum=bswap_32(f->header.e_phnum);
+	  f->header.e_shentsize=bswap_32(f->header.e_shentsize);
+	  f->header.e_shnum=bswap_32(f->header.e_shnum);
+	  f->header.e_shstrndx=bswap_32(f->header.e_shstrndx);
+#endif
+  }
+
   if (f->header.e_ident[EI_CLASS] != ELFCLASSM
       || f->header.e_ident[EI_DATA] != ELFDATAM
       || f->header.e_ident[EI_VERSION] != EV_CURRENT
       || !MATCH_MACHINE(f->header.e_machine))
     {
-      error("ELF file %s not for this architecture", filename);
-      return NULL;
+      error("WARNING: ELF file %s not for this architecture", filename);
+      //return NULL;
     }
   if (f->header.e_type != e_type && e_type != ET_NONE)
     {
@@ -116,6 +164,33 @@
     {
       struct obj_section *sec;
 
+      if (byteswap==1) {
+#if ELFCLASSM == ELFCLASS32
+	  section_headers[i].sh_name=bswap_32(section_headers[i].sh_name);
+	  section_headers[i].sh_type=bswap_32(section_headers[i].sh_type);
+	  section_headers[i].sh_flags=bswap_32(section_headers[i].sh_flags);
+	  section_headers[i].sh_addr=bswap_32(section_headers[i].sh_addr);
+	  section_headers[i].sh_offset=bswap_32(section_headers[i].sh_offset);
+	  section_headers[i].sh_size=bswap_32(section_headers[i].sh_size);
+	  section_headers[i].sh_link=bswap_32(section_headers[i].sh_link);
+	  section_headers[i].sh_info=bswap_32(section_headers[i].sh_info);
+	  section_headers[i].sh_addralign=bswap_32(section_headers[i].sh_addralign);
+	  section_headers[i].sh_entsize=bswap_32(section_headers[i].sh_entsize);
+#endif
+#if ELFCLASSM == ELFCLASS64
+	  section_headers[i].sh_name=bswap_64(section_headers[i].sh_name);
+	  section_headers[i].sh_type=bswap_64(section_headers[i].sh_type);
+	  section_headers[i].sh_flags=bswap_64(section_headers[i].sh_flags);
+	  section_headers[i].sh_addr=bswap_64(section_headers[i].sh_addr);
+	  section_headers[i].sh_offset=bswap_64(section_headers[i].sh_offset);
+	  section_headers[i].sh_size=bswap_64(section_headers[i].sh_size);
+	  section_headers[i].sh_link=bswap_64(section_headers[i].sh_link);
+	  section_headers[i].sh_info=bswap_64(section_headers[i].sh_info);
+	  section_headers[i].sh_addralign=bswap_64(section_headers[i].sh_addralign);
+	  section_headers[i].sh_entsize=bswap_64(section_headers[i].sh_entsize);
+#endif
+      }
+
       f->sections[i] = sec = arch_new_section();
       memset(sec, 0, sizeof(*sec));
 
@@ -223,6 +298,20 @@
 	    nsym = sec->header.sh_size / sizeof(ElfW(Sym));
 	    strtab = f->sections[sec->header.sh_link]->contents;
 	    sym = (ElfW(Sym) *) sec->contents;
+	    if (byteswap==1) {
+#if ELFCLASSM == ELFCLASS32
+		sym->st_name = bswap_32(sym->st_name);
+		sym->st_value = bswap_32(sym->st_value);
+		sym->st_size = bswap_32(sym->st_size);
+		sym->st_shndx = bswap_16(sym->st_shndx);
+#endif
+#if ELFCLASSM == ELFCLASS64
+		sym->st_name = bswap_64(sym->st_name);
+		sym->st_value = bswap_64(sym->st_value);
+		sym->st_size = bswap_64(sym->st_size);
+		sym->st_shndx = bswap_16(sym->st_shndx);
+#endif
+	    }
 
 	    /* Allocate space for a table of local symbols.  */
 	    j = f->local_symtab_size = sec->header.sh_info;
@@ -233,6 +322,22 @@
 	    for (j = 1, ++sym; j < nsym; ++j, ++sym)
 	      {
 		const char *name;
+
+		if (byteswap==1) {
+#if ELFCLASSM == ELFCLASS32
+		    sym->st_name = bswap_32(sym->st_name);
+		    sym->st_value = bswap_32(sym->st_value);
+		    sym->st_size = bswap_32(sym->st_size);
+		    sym->st_shndx = bswap_16(sym->st_shndx);
+#endif
+#if ELFCLASSM == ELFCLASS64
+		    sym->st_name = bswap_64(sym->st_name);
+		    sym->st_value = bswap_64(sym->st_value);
+		    sym->st_size = bswap_64(sym->st_size);
+		    sym->st_shndx = bswap_16(sym->st_shndx);
+#endif
+		}
+
 		if (sym->st_name)
 		  name = strtab+sym->st_name;
 		else
@@ -298,9 +403,26 @@
 	      {
 		struct obj_symbol *intsym;
 		unsigned long symndx;
+		if (byteswap==1) {
+#if ELFCLASSM == ELFCLASS32
+		    rel->r_offset = bswap_32(rel->r_offset);
+		    rel->r_info = bswap_32(rel->r_info);
+#if Elf32_RelM != Elf32_Rel
+		    rel->r_addend = bswap_32(rel->r_addend);
+#endif
+#endif
+#if ELFCLASSM == ELFCLASS64
+		    rel->r_offset = bswap_64(rel->r_offset);
+		    rel->r_info = bswap_64(rel->r_info);
+#if Elf32_RelM != Elf32_Rel
+		    rel->r_addend = bswap_64(rel->r_addend);
+#endif
+#endif
+		}
 		symndx = ELFW(R_SYM)(rel->r_info);
 		if (symndx)
 		  {
+		    ElfW(Sym) *sym;
 		    if (symndx >= nsyms)
 		      {
 			error("%s: Bad symbol index: %08lx >= %08lx",
@@ -308,7 +430,22 @@
 			continue;
 		      }
 
-		    obj_find_relsym(intsym, f, f, rel, (ElfW(Sym) *)(symtab->contents), strtab);
+		    sym = (ElfW(Sym) *)(symtab->contents);
+		    if (byteswap==1) {
+#if ELFCLASSM == ELFCLASS32
+			sym->st_name = bswap_32(sym->st_name);
+			sym->st_value = bswap_32(sym->st_value);
+			sym->st_size = bswap_32(sym->st_size);
+			sym->st_shndx = bswap_16(sym->st_shndx);
+#endif
+#if ELFCLASSM == ELFCLASS64
+			sym->st_name = bswap_64(sym->st_name);
+			sym->st_value = bswap_64(sym->st_value);
+			sym->st_size = bswap_64(sym->st_size);
+			sym->st_shndx = bswap_16(sym->st_shndx);
+#endif
+		    }
+		    obj_find_relsym(intsym, f, f, rel, sym, strtab);
 		    intsym->r_type = ELFW(R_TYPE)(rel->r_info);
 		  }
 	      }
--- modutils-2.4.27/obj/obj_reloc.c.orig	2003-10-26 18:25:08.000000000 -0800
+++ modutils-2.4.27/obj/obj_reloc.c	2006-06-20 17:47:11.000000000 -0700
@@ -331,6 +331,18 @@
 	  value += rel->r_addend;
 #endif
 
+	  /* Byte swap if necessary. For some archs, other adjustments may
+	     need to be done in arch_apply_relocation. */
+	  if (byteswap==1)
+	    {
+	      if (sizeof(unsigned tgt_long) == 4)
+		*(tgt_long *)(targsec->contents + rel->r_offset) =
+		  bswap_32(*(tgt_long *)(targsec->contents + rel->r_offset));
+	      else if (sizeof(unsigned tgt_long) == 8)
+		*(tgt_long *)(targsec->contents + rel->r_offset) =
+		  bswap_64(*(tgt_long *)(targsec->contents + rel->r_offset));
+	    }
+
 	  /* Do it! */
 	  switch (arch_apply_relocation(f,targsec,symsec,intsym,rel,value))
 	    {
--- odutils-2.4.27.0.orig/include/module.h.orig	2006-01-10 08:15:09.000000000 -0700
+++ odutils-2.4.27.0/include/module.h	2006-01-10 08:15:13.000000000 -0700
@@ -88,16 +88,34 @@
 /* For sizeof() which are related to the module platform and not to the
    environment isnmod is running in, use sizeof_xx instead of sizeof(xx).  */
 
-#define tgt_sizeof_char		sizeof(char)
-#define tgt_sizeof_short	sizeof(short)
-#define tgt_sizeof_int		sizeof(int)
-#define tgt_sizeof_long		sizeof(long)
-#define tgt_sizeof_char_p	sizeof(char *)
-#define tgt_sizeof_void_p	sizeof(void *)
-#define tgt_long		long
+#include <stdint.h>
+
+#if ELFCLASSM == ELFCLASS32
+
+#define tgt_sizeof_char		1
+#define tgt_sizeof_short	2
+#define tgt_sizeof_int		4
+#define tgt_sizeof_long		4
+#define tgt_sizeof_char_p	4
+#define tgt_sizeof_void_p	4
+#define tgt_long		int
 #define tgt_long_fmt		"l"
 #define tgt_strtoul		strtoul
 
+#else
+
+#define tgt_sizeof_char		1
+#define tgt_sizeof_short	2
+#define tgt_sizeof_int		4
+#define tgt_sizeof_long		8
+#define tgt_sizeof_char_p	8
+#define tgt_sizeof_void_p	8
+#define tgt_long		long
+#define tgt_long_fmt		"ll"
+#define tgt_strtoul		strtoull
+
+#endif
+
 /* This assumes that long long on a 32 bit system is equivalent to long on the
  * equivalent 64 bit system.  Also that void and char pointers are 8 bytes on
  * all 64 bit systems.  Add per system tweaks if it ever becomes necessary.