|
|
1.1 ! root 1: #include <stdint.h> ! 2: #include <stddef.h> ! 3: #include <stdio.h> ! 4: #include <stdlib.h> ! 5: #include <unistd.h> ! 6: #include <fcntl.h> ! 7: #include <errno.h> ! 8: #include <sys/types.h> ! 9: #include <sys/stat.h> ! 10: #include <sys/mman.h> ! 11: #include <elf.h> ! 12: #include <ipxe/tables.h> ! 13: ! 14: #define DEBUG 0 ! 15: ! 16: #define eprintf(...) fprintf ( stderr, __VA_ARGS__ ) ! 17: ! 18: #define dprintf(...) do { \ ! 19: if ( DEBUG ) \ ! 20: fprintf ( stderr, __VA_ARGS__ ); \ ! 21: } while ( 0 ) ! 22: ! 23: #ifdef SELF_INCLUDED ! 24: ! 25: /** ! 26: * Fix up ICC alignments ! 27: * ! 28: * @v elf ELF header ! 29: * @ret rc Return status code ! 30: * ! 31: * See comments in tables.h for an explanation of why this monstrosity ! 32: * is necessary. ! 33: */ ! 34: static int ICCFIX ( void *elf ) { ! 35: ELF_EHDR *ehdr = elf; ! 36: ELF_SHDR *shdr = ( elf + ehdr->e_shoff ); ! 37: size_t shentsize = ehdr->e_shentsize; ! 38: unsigned int shnum = ehdr->e_shnum; ! 39: ELF_SHDR *strtab = ( ( ( void * ) shdr ) + ! 40: ( ehdr->e_shstrndx * shentsize ) ); ! 41: char *strings = ( elf + strtab->sh_offset ); ! 42: ! 43: for ( ; shnum-- ; shdr = ( ( ( void * ) shdr ) + shentsize ) ) { ! 44: char *name = ( strings + shdr->sh_name ); ! 45: unsigned long align = shdr->sh_addralign; ! 46: unsigned long new_align; ! 47: ! 48: if ( ( strncmp ( name, ".tbl.", 5 ) == 0 ) && ! 49: ( align >= ICC_ALIGN_HACK_FACTOR ) ) { ! 50: new_align = ( align / ICC_ALIGN_HACK_FACTOR ); ! 51: shdr->sh_addralign = new_align; ! 52: dprintf ( "Section \"%s\": alignment %d->%d\n", ! 53: name, align, new_align ); ! 54: } ! 55: } ! 56: return 0; ! 57: } ! 58: ! 59: #else /* SELF_INCLUDED */ ! 60: ! 61: #define SELF_INCLUDED ! 62: ! 63: /* Include iccfix32() function */ ! 64: #define ELF_EHDR Elf32_Ehdr ! 65: #define ELF_SHDR Elf32_Shdr ! 66: #define ICCFIX iccfix32 ! 67: #include "iccfix.c" ! 68: #undef ELF_EHDR ! 69: #undef ELF_SHDR ! 70: #undef ICCFIX ! 71: ! 72: /* Include iccfix64() function */ ! 73: #define ELF_EHDR Elf64_Ehdr ! 74: #define ELF_SHDR Elf64_Shdr ! 75: #define ICCFIX iccfix64 ! 76: #include "iccfix.c" ! 77: #undef ELF_EHDR ! 78: #undef ELF_SHDR ! 79: #undef ICCFIX ! 80: ! 81: static int iccfix ( const char *filename ) { ! 82: int fd; ! 83: struct stat stat; ! 84: void *elf; ! 85: unsigned char *eident; ! 86: int rc; ! 87: ! 88: /* Open and mmap file */ ! 89: fd = open ( filename, O_RDWR ); ! 90: if ( fd < 0 ) { ! 91: eprintf ( "Could not open %s: %s\n", ! 92: filename, strerror ( errno ) ); ! 93: rc = -1; ! 94: goto err_open; ! 95: } ! 96: if ( fstat ( fd, &stat ) < 0 ) { ! 97: eprintf ( "Could not determine size of %s: %s\n", ! 98: filename, strerror ( errno ) ); ! 99: rc = -1; ! 100: goto err_fstat; ! 101: } ! 102: elf = mmap ( NULL, stat.st_size, ( PROT_READ | PROT_WRITE ), ! 103: MAP_SHARED, fd, 0 ); ! 104: if ( elf == MAP_FAILED ) { ! 105: eprintf ( "Could not map %s: %s\n", ! 106: filename, strerror ( errno ) ); ! 107: rc = -1; ! 108: goto err_mmap; ! 109: } ! 110: ! 111: /* Perform fixups */ ! 112: eident = elf; ! 113: switch ( eident[EI_CLASS] ) { ! 114: case ELFCLASS32: ! 115: rc = iccfix32 ( elf ); ! 116: break; ! 117: case ELFCLASS64: ! 118: rc = iccfix64 ( elf ); ! 119: break; ! 120: default: ! 121: eprintf ( "Unknown ELF class %d in %s\n", ! 122: eident[EI_CLASS], filename ); ! 123: rc = -1; ! 124: break; ! 125: } ! 126: ! 127: munmap ( elf, stat.st_size ); ! 128: err_mmap: ! 129: err_fstat: ! 130: close ( fd ); ! 131: err_open: ! 132: return rc; ! 133: } ! 134: ! 135: int main ( int argc, char **argv ) { ! 136: int i; ! 137: int rc; ! 138: ! 139: /* Parse command line */ ! 140: if ( argc < 2 ) { ! 141: eprintf ( "Syntax: %s <object_file>...\n", argv[0] ); ! 142: exit ( 1 ); ! 143: } ! 144: ! 145: /* Process each object in turn */ ! 146: for ( i = 1 ; i < argc ; i++ ) { ! 147: if ( ( rc = iccfix ( argv[i] ) ) != 0 ) { ! 148: eprintf ( "Could not fix up %s\n", argv[i] ); ! 149: exit ( 1 ); ! 150: } ! 151: } ! 152: ! 153: return 0; ! 154: } ! 155: ! 156: #endif /* SELF_INCLUDED */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.