Changeset 75dd55d in mainline for kernel/generic/src/lib/elf.c


Ignore:
Timestamp:
2007-10-26T19:34:27Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a228687
Parents:
c4e75ea
Message:

Fix elf.c's formatting and add code that can be later enhanced and used to
remember task's TLS section alignment, address and size.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/lib/elf.c

    rc4e75ea r75dd55d  
    5757};
    5858
    59 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, as_t *as);
    60 static int section_header(elf_section_header_t *entry, elf_header_t *elf, as_t *as);
    61 static int load_segment(elf_segment_header_t *entry, elf_header_t *elf, as_t *as);
     59static int segment_header(elf_segment_header_t *entry, elf_header_t *elf,
     60    as_t *as);
     61static int section_header(elf_section_header_t *entry, elf_header_t *elf,
     62    as_t *as);
     63static int load_segment(elf_segment_header_t *entry, elf_header_t *elf,
     64    as_t *as);
    6265
    6366/** ELF loader
     
    7275
    7376        /* Identify ELF */
    74         if (header->e_ident[EI_MAG0] != ELFMAG0 || header->e_ident[EI_MAG1] != ELFMAG1 ||
    75             header->e_ident[EI_MAG2] != ELFMAG2 || header->e_ident[EI_MAG3] != ELFMAG3) {
     77        if (header->e_ident[EI_MAG0] != ELFMAG0 ||
     78            header->e_ident[EI_MAG1] != ELFMAG1 ||
     79            header->e_ident[EI_MAG2] != ELFMAG2 ||
     80            header->e_ident[EI_MAG3] != ELFMAG3) {
    7681                return EE_INVALID;
    7782        }
    7883       
    7984        /* Identify ELF compatibility */
    80         if (header->e_ident[EI_DATA] != ELF_DATA_ENCODING || header->e_machine != ELF_MACHINE ||
    81             header->e_ident[EI_VERSION] != EV_CURRENT || header->e_version != EV_CURRENT ||
     85        if (header->e_ident[EI_DATA] != ELF_DATA_ENCODING ||
     86            header->e_machine != ELF_MACHINE ||
     87            header->e_ident[EI_VERSION] != EV_CURRENT ||
     88            header->e_version != EV_CURRENT ||
    8289            header->e_ident[EI_CLASS] != ELF_CLASS) {
    8390                return EE_INCOMPATIBLE;
     
    96103        /* Walk through all segment headers and process them. */
    97104        for (i = 0; i < header->e_phnum; i++) {
    98                 rc = segment_header(&((elf_segment_header_t *)(((uint8_t *) header) + header->e_phoff))[i], header, as);
     105                elf_segment_header_t *seghdr;
     106
     107                seghdr = &((elf_segment_header_t *)(((uint8_t *) header) +
     108                    header->e_phoff))[i];
     109                rc = segment_header(seghdr, header, as);
    99110                if (rc != EE_OK)
    100111                        return rc;
     
    103114        /* Inspect all section headers and proccess them. */
    104115        for (i = 0; i < header->e_shnum; i++) {
    105                 rc = section_header(&((elf_section_header_t *)(((uint8_t *) header) + header->e_shoff))[i], header, as);
     116                elf_section_header_t *sechdr;
     117
     118                sechdr = &((elf_section_header_t *)(((uint8_t *) header) +
     119                    header->e_shoff))[i];
     120                rc = section_header(sechdr, header, as);
    106121                if (rc != EE_OK)
    107122                        return rc;
     
    119134char *elf_error(int rc)
    120135{
    121         ASSERT(rc < sizeof(error_codes)/sizeof(char *));
     136        ASSERT(rc < sizeof(error_codes) / sizeof(char *));
    122137
    123138        return error_codes[rc];
     
    132147 * @return EE_OK on success, error code otherwise.
    133148 */
    134 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, as_t *as)
     149static int segment_header(elf_segment_header_t *entry, elf_header_t *elf,
     150    as_t *as)
    135151{
    136152        switch (entry->p_type) {
     
    172188
    173189        if (entry->p_align > 1) {
    174                 if ((entry->p_offset % entry->p_align) != (entry->p_vaddr % entry->p_align)) {
     190                if ((entry->p_offset % entry->p_align) !=
     191                    (entry->p_vaddr % entry->p_align)) {
    175192                        return EE_INVALID;
    176193                }
     
    191208                return EE_UNSUPPORTED;
    192209
    193         a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr, AS_AREA_ATTR_NONE,
    194                 &elf_backend, &backend_data);
     210        a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr,
     211            AS_AREA_ATTR_NONE, &elf_backend, &backend_data);
    195212        if (!a)
    196213                return EE_MEMORY;
     
    211228 * @return EE_OK on success, error code otherwise.
    212229 */
    213 static int section_header(elf_section_header_t *entry, elf_header_t *elf, as_t *as)
     230static int section_header(elf_section_header_t *entry, elf_header_t *elf,
     231    as_t *as)
    214232{
    215233        switch (entry->sh_type) {
     234        case SHT_PROGBITS:
     235                if (entry->sh_flags & SHF_TLS) {
     236                        /* .tdata */
     237                }
     238                break;
     239        case SHT_NOBITS:
     240                if (entry->sh_flags & SHF_TLS) {
     241                        /* .tbss */
     242                }
     243                break;
    216244        default:
    217245                break;
Note: See TracChangeset for help on using the changeset viewer.