elf64getsec.c - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
       elf64getsec.c (1462B)
       ---
            1 #include <stdio.h>
            2 
            3 #include <scc/mach.h>
            4 #include <scc/elf64.h>
            5 
            6 #include "../libmach.h"
            7 #include "fun.h"
            8 
            9 Section *
           10 elf64getsec(Obj *obj, int *idx, Section *sec)
           11 {
           12         int stype, n = *idx;
           13         unsigned long flags, type;
           14         unsigned sflags;
           15         Elf64 *elf = obj->data;
           16         Elf_Ehdr *hdr = &elf->hdr;
           17         Elf_Shdr *shdr;
           18 
           19         if (n >= elf->nsec) {
           20                 if (n == SHN_ABS)
           21                         sec->name = "*ABS";
           22                 else if (n == SHN_COMMON)
           23                         sec->name = "*COM*";
           24                 else
           25                         sec->name = "*UNK*";
           26                 return NULL;
           27         }
           28 
           29         shdr = &elf->shdr[n];
           30         flags = shdr->sh_flags;
           31         type = shdr->sh_type;
           32 
           33         if (flags & SHF_ALLOC) {
           34                 if (type == SHT_NOBITS)
           35                         stype = 'B';
           36                 else if (flags & SHF_WRITE)
           37                         stype = 'D';
           38                 else
           39                         stype = 'T';
           40         } else {
           41                 stype = 'N';
           42         }
           43 
           44         sflags = 0;
           45         if (flags & SHF_WRITE)
           46                 sflags |= SWRITE;
           47         if (flags  & SHF_EXECINSTR)
           48                 sflags |= SEXEC;
           49         if (flags & SHF_ALLOC)
           50                 sflags |= SLOAD|SREAD;
           51         if (type != SHT_NOBITS)
           52                 sflags |= SALLOC;
           53         if (stype == 'T' || stype == 'D')
           54                 sflags |= SRELOC;
           55 
           56         /*
           57          * We cannot differentiate between load and base address
           58          * in a section, while we can use the physical address
           59          * for that when dealing with segments.
           60          */
           61         if (n == SHN_UNDEF)
           62                 sec->name = "*UND*";
           63         else
           64                 sec->name = elf64str(obj, SEC_STRTBL, shdr->sh_name);
           65 
           66         sec->index = n;
           67         sec->size = shdr->sh_size;
           68         sec->base = shdr->sh_addr;
           69         sec->load = shdr->sh_addr;
           70         sec->offset = shdr->sh_offset;
           71         sec->type = stype;
           72         sec->flags = sflags;
           73         sec->align = shdr->sh_addralign;
           74 
           75         return sec;
           76 }