Annotation of qemu/roms/ipxe/src/util/iccfix.c, revision 1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.