From 0d09821e49f7b1cc92934704f8495de5f0f2a6be Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Fri, 30 Sep 2005 20:22:13 +0000 Subject: After some effort, I have taught depmod to handle endianness, allowing us to build a cross-depmod that runs on the host and generates the target modules.dep and modules.*map files -Erik --- package/modutils/modutils-01.patch | 98 ++++++++ package/modutils/modutils-cross.patch | 453 ++++++++++++++++++++++++++++++++++ package/modutils/modutils.patch | 98 -------- 3 files changed, 551 insertions(+), 98 deletions(-) create mode 100644 package/modutils/modutils-01.patch create mode 100644 package/modutils/modutils-cross.patch delete mode 100644 package/modutils/modutils.patch diff --git a/package/modutils/modutils-01.patch b/package/modutils/modutils-01.patch new file mode 100644 index 000000000..e0303b21c --- /dev/null +++ b/package/modutils/modutils-01.patch @@ -0,0 +1,98 @@ +diff -ur modutils-2.4.27/Makefile.in modutils-2.4.27-patched/Makefile.in +--- modutils-2.4.27/Makefile.in 2004-03-07 01:24:48.000000000 -0600 ++++ modutils-2.4.27-patched/Makefile.in 2005-08-17 08:41:57.000000000 -0500 +@@ -3,7 +3,7 @@ + include Makefile.common + + TARGETS = all install-bin clean distclean realclean dep depend +-SUBDIRS = util obj insmod genksyms depmod @kerneld_SUBDIR@ ++SUBDIRS = util obj insmod depmod @kerneld_SUBDIR@ + ifneq (@kerneld_SUBDIR@,) + SUBDIRS += man_kerneld + endif +diff -ur modutils-2.4.27/depmod/depmod.c modutils-2.4.27-patched/depmod/depmod.c +--- modutils-2.4.27/depmod/depmod.c 2003-03-22 20:34:28.000000000 -0600 ++++ modutils-2.4.27-patched/depmod/depmod.c 2005-08-17 21:33:40.000000000 -0500 +@@ -1132,8 +1132,11 @@ + return -1; + + for (ksym = ksyms; so_far < nksyms; ++so_far, ksym++) { +- if (strncmp((char *)ksym->name, "GPLONLY_", 8) == 0) +- ((char *)ksym->name) += 8; ++ if (strncmp((char *)ksym->name, "GPLONLY_", 8) == 0) { ++ char *p = (char *)ksym->name; ++ p += 8; ++ ksym->name = p; ++ } + assert(n_syms < MAX_MAP_SYM); + symtab[n_syms++] = addsym((char *)ksym->name, mod, SYM_DEFINED, 0); + } +diff -ur modutils-2.4.27/insmod/Makefile.in modutils-2.4.27-patched/insmod/Makefile.in +--- modutils-2.4.27/insmod/Makefile.in 2003-10-26 22:42:07.000000000 -0600 ++++ modutils-2.4.27-patched/insmod/Makefile.in 2005-08-17 08:41:57.000000000 -0500 +@@ -126,10 +126,6 @@ + $(MKDIR) $(DESTDIR)$(sbindir); \ + $(INSTALL) $(STRIP) $$i $(DESTDIR)$(sbindir); done; + set -e; \ +- for i in $(srcdir)/insmod_ksymoops_clean $(srcdir)/kernelversion; do \ +- $(MKDIR) $(DESTDIR)$(sbindir); \ +- $(INSTALL) $$i $(DESTDIR)$(sbindir); done; +- set -e; \ + for i in $(COMB); do \ + ln -sf insmod $(DESTDIR)$(sbindir)/$$i; \ + (test "$(insmod_static)" = yes && \ +diff -ur modutils-2.4.27/insmod/insmod.c modutils-2.4.27-patched/insmod/insmod.c +--- modutils-2.4.27/insmod/insmod.c 2003-10-26 20:34:46.000000000 -0600 ++++ modutils-2.4.27-patched/insmod/insmod.c 2005-08-17 21:34:04.000000000 -0500 +@@ -274,8 +274,11 @@ + */ + if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) { + gplonly_seen = 1; +- if (gpl) +- ((char *)s->name) += 8; ++ if (gpl) { ++ char *p = (char *)s->name; ++ p += 8; ++ s->name = p; ++ } + else + continue; + } +diff -ur modutils-2.4.27/obj/obj_kallsyms.c modutils-2.4.27-patched/obj/obj_kallsyms.c +--- modutils-2.4.27/obj/obj_kallsyms.c 2002-02-28 18:39:06.000000000 -0600 ++++ modutils-2.4.27-patched/obj/obj_kallsyms.c 2005-08-17 21:29:36.000000000 -0500 +@@ -200,8 +200,8 @@ + + /* Initial contents, header + one entry per input section. No strings. */ + osec->header.sh_size = sizeof(*a_hdr) + loaded*sizeof(*a_sec); +- a_hdr = (struct kallsyms_header *) osec->contents = +- xmalloc(osec->header.sh_size); ++ osec->contents = xmalloc(osec->header.sh_size); ++ a_hdr = (struct kallsyms_header *) osec->contents; + memset(osec->contents, 0, osec->header.sh_size); + a_hdr->size = sizeof(*a_hdr); + a_hdr->sections = loaded; +@@ -275,8 +275,8 @@ + a_hdr->symbol_off + + a_hdr->symbols*a_hdr->symbol_size + + strings_size - strings_left; +- a_hdr = (struct kallsyms_header *) osec->contents = +- xrealloc(a_hdr, a_hdr->total_size); ++ osec->contents = xrealloc(a_hdr, a_hdr->total_size); ++ a_hdr = (struct kallsyms_header *) osec->contents; + p = (char *)a_hdr + a_hdr->symbol_off; + memcpy(p, symbols, a_hdr->symbols*a_hdr->symbol_size); + free(symbols); +diff -ur modutils-2.4.27/obj/obj_mips.c modutils-2.4.27-patched/obj/obj_mips.c +--- modutils-2.4.27/obj/obj_mips.c 2003-04-04 16:47:17.000000000 -0600 ++++ modutils-2.4.27-patched/obj/obj_mips.c 2005-08-17 21:29:20.000000000 -0500 +@@ -244,7 +244,8 @@ + archdata_sec->header.sh_size = 0; + sec = obj_find_section(f, "__dbe_table"); + if (sec) { +- ad = (struct archdata *) (archdata_sec->contents) = xmalloc(sizeof(*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___dbe_table = sec->header.sh_addr; diff --git a/package/modutils/modutils-cross.patch b/package/modutils/modutils-cross.patch new file mode 100644 index 000000000..f24bff031 --- /dev/null +++ b/package/modutils/modutils-cross.patch @@ -0,0 +1,453 @@ +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 + #include ++#include ++#include + #include + #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 + #include + ++int byteswap; ++ + /*======================================================================*/ + + /* Standard ELF hash function. */ +diff -urN modutils-2.4.27.0.orig/obj/obj_load.c modutils-2.4.27.0/obj/obj_load.c +--- modutils-2.4.27.0.orig/obj/obj_load.c 2003-10-26 19:59:12.000000000 -0700 ++++ modutils-2.4.27.0/obj/obj_load.c 2005-09-29 17:00:23.000000000 -0600 +@@ -62,6 +62,54 @@ + 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 +@@ -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); + } + } +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 + } diff --git a/package/modutils/modutils.patch b/package/modutils/modutils.patch deleted file mode 100644 index e0303b21c..000000000 --- a/package/modutils/modutils.patch +++ /dev/null @@ -1,98 +0,0 @@ -diff -ur modutils-2.4.27/Makefile.in modutils-2.4.27-patched/Makefile.in ---- modutils-2.4.27/Makefile.in 2004-03-07 01:24:48.000000000 -0600 -+++ modutils-2.4.27-patched/Makefile.in 2005-08-17 08:41:57.000000000 -0500 -@@ -3,7 +3,7 @@ - include Makefile.common - - TARGETS = all install-bin clean distclean realclean dep depend --SUBDIRS = util obj insmod genksyms depmod @kerneld_SUBDIR@ -+SUBDIRS = util obj insmod depmod @kerneld_SUBDIR@ - ifneq (@kerneld_SUBDIR@,) - SUBDIRS += man_kerneld - endif -diff -ur modutils-2.4.27/depmod/depmod.c modutils-2.4.27-patched/depmod/depmod.c ---- modutils-2.4.27/depmod/depmod.c 2003-03-22 20:34:28.000000000 -0600 -+++ modutils-2.4.27-patched/depmod/depmod.c 2005-08-17 21:33:40.000000000 -0500 -@@ -1132,8 +1132,11 @@ - return -1; - - for (ksym = ksyms; so_far < nksyms; ++so_far, ksym++) { -- if (strncmp((char *)ksym->name, "GPLONLY_", 8) == 0) -- ((char *)ksym->name) += 8; -+ if (strncmp((char *)ksym->name, "GPLONLY_", 8) == 0) { -+ char *p = (char *)ksym->name; -+ p += 8; -+ ksym->name = p; -+ } - assert(n_syms < MAX_MAP_SYM); - symtab[n_syms++] = addsym((char *)ksym->name, mod, SYM_DEFINED, 0); - } -diff -ur modutils-2.4.27/insmod/Makefile.in modutils-2.4.27-patched/insmod/Makefile.in ---- modutils-2.4.27/insmod/Makefile.in 2003-10-26 22:42:07.000000000 -0600 -+++ modutils-2.4.27-patched/insmod/Makefile.in 2005-08-17 08:41:57.000000000 -0500 -@@ -126,10 +126,6 @@ - $(MKDIR) $(DESTDIR)$(sbindir); \ - $(INSTALL) $(STRIP) $$i $(DESTDIR)$(sbindir); done; - set -e; \ -- for i in $(srcdir)/insmod_ksymoops_clean $(srcdir)/kernelversion; do \ -- $(MKDIR) $(DESTDIR)$(sbindir); \ -- $(INSTALL) $$i $(DESTDIR)$(sbindir); done; -- set -e; \ - for i in $(COMB); do \ - ln -sf insmod $(DESTDIR)$(sbindir)/$$i; \ - (test "$(insmod_static)" = yes && \ -diff -ur modutils-2.4.27/insmod/insmod.c modutils-2.4.27-patched/insmod/insmod.c ---- modutils-2.4.27/insmod/insmod.c 2003-10-26 20:34:46.000000000 -0600 -+++ modutils-2.4.27-patched/insmod/insmod.c 2005-08-17 21:34:04.000000000 -0500 -@@ -274,8 +274,11 @@ - */ - if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) { - gplonly_seen = 1; -- if (gpl) -- ((char *)s->name) += 8; -+ if (gpl) { -+ char *p = (char *)s->name; -+ p += 8; -+ s->name = p; -+ } - else - continue; - } -diff -ur modutils-2.4.27/obj/obj_kallsyms.c modutils-2.4.27-patched/obj/obj_kallsyms.c ---- modutils-2.4.27/obj/obj_kallsyms.c 2002-02-28 18:39:06.000000000 -0600 -+++ modutils-2.4.27-patched/obj/obj_kallsyms.c 2005-08-17 21:29:36.000000000 -0500 -@@ -200,8 +200,8 @@ - - /* Initial contents, header + one entry per input section. No strings. */ - osec->header.sh_size = sizeof(*a_hdr) + loaded*sizeof(*a_sec); -- a_hdr = (struct kallsyms_header *) osec->contents = -- xmalloc(osec->header.sh_size); -+ osec->contents = xmalloc(osec->header.sh_size); -+ a_hdr = (struct kallsyms_header *) osec->contents; - memset(osec->contents, 0, osec->header.sh_size); - a_hdr->size = sizeof(*a_hdr); - a_hdr->sections = loaded; -@@ -275,8 +275,8 @@ - a_hdr->symbol_off + - a_hdr->symbols*a_hdr->symbol_size + - strings_size - strings_left; -- a_hdr = (struct kallsyms_header *) osec->contents = -- xrealloc(a_hdr, a_hdr->total_size); -+ osec->contents = xrealloc(a_hdr, a_hdr->total_size); -+ a_hdr = (struct kallsyms_header *) osec->contents; - p = (char *)a_hdr + a_hdr->symbol_off; - memcpy(p, symbols, a_hdr->symbols*a_hdr->symbol_size); - free(symbols); -diff -ur modutils-2.4.27/obj/obj_mips.c modutils-2.4.27-patched/obj/obj_mips.c ---- modutils-2.4.27/obj/obj_mips.c 2003-04-04 16:47:17.000000000 -0600 -+++ modutils-2.4.27-patched/obj/obj_mips.c 2005-08-17 21:29:20.000000000 -0500 -@@ -244,7 +244,8 @@ - archdata_sec->header.sh_size = 0; - sec = obj_find_section(f, "__dbe_table"); - if (sec) { -- ad = (struct archdata *) (archdata_sec->contents) = xmalloc(sizeof(*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___dbe_table = sec->header.sh_addr; -- cgit v1.2.3