X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Flink%2Fhc08%2Flkelf.c;h=e1c191ff046ab069fd40f31bca4eb816496ad118;hb=22ec133e94d056a395025c302b6c331c8cd04658;hp=3cc602fd483de07718419311c0c42af01075ddd5;hpb=4d083eb86c1055c201f3f82e80b0ff4a7e49cb66;p=fw%2Fsdcc diff --git a/as/link/hc08/lkelf.c b/as/link/hc08/lkelf.c index 3cc602fd..e1c191ff 100644 --- a/as/link/hc08/lkelf.c +++ b/as/link/hc08/lkelf.c @@ -1,38 +1,27 @@ -/*------------------------------------------------------------------------- - lkelf.c - Create an executable ELF/DWARF file +/* lkelf.c - Create an executable ELF/DWARF file - Written By - Erik Petrich, epetrich@users.sourceforge.net (2004) + Copyright (C) 2004 Erik Petrich, epetrich at users dot sourceforge dot net - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3, or (at your option) any +later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --------------------------------------------------------------------------*/ +You should have received a copy of the GNU General Public License +along with this program. If not, see . */ #include #include #include #include -#include "aslink.h" +#include -#ifdef _WIN32 -# ifdef __MINGW32__ /* GCC MINGW32 depends on configure */ -# include "sdccconf.h" -# else -# include "sdcc_vc.h" -# endif -#else /* Assume Un*x style system */ -# include "sdccconf.h" -#endif +#include "aslink.h" static int execStartMSB; static int execStartLSB; @@ -224,17 +213,17 @@ static void listAdd (listHeader * lhp, void * item) { listEntry * lep; - + lep = new (sizeof (*lep)); lep->item = item; lep->prev = lhp->last; if (lep->prev) lep->prev->next = lep; - + lhp->last = lep; if (!lhp->first) lhp->first = lep; - + lhp->count++; } @@ -242,27 +231,27 @@ static listHeader * listNew (void) { listHeader * lhp; - + lhp = new (sizeof (*lhp)); - + return lhp; } #if 0 -static Elf32_Word +static Elf32_Word strtabFind (strtabList * strtab, char * str) { strtabString * sp; sp = strtab->first; - + while (sp) { if (!strcmp (str, sp->string)) return sp->index; sp = sp->next; } - + return 0; } #endif @@ -272,7 +261,7 @@ strtabFind (strtabList * strtab, char * str) /* string if it does not already exist. Returns the offset of the */ /* string in the table. */ /*-------------------------------------------------------------------*/ -static Elf32_Word +static Elf32_Word strtabFindOrAdd (strtabList * strtab, char * str) { strtabString * sp; @@ -284,7 +273,7 @@ strtabFindOrAdd (strtabList * strtab, char * str) return sp->index; sp = sp->next; } - + sp = new (sizeof(*sp)); if (strtab->last) sp->index = strtab->last->index + 1 + strlen (strtab->last->string); @@ -292,14 +281,14 @@ strtabFindOrAdd (strtabList * strtab, char * str) sp->index = 1; sp->string = new (1+strlen (str)); strcpy (sp->string, str); - + sp->prev = strtab->last; if (sp->prev) sp->prev->next = sp; strtab->last = sp; if (!strtab->first) strtab->first = sp; - + return sp->index; } @@ -310,9 +299,9 @@ static void fputElfStrtab (strtabList *strtab, FILE *fp) { strtabString * sp; - - fputc (0, fp); /* index 0 must be the null character */ - + + fputc (0, fp); /* index 0 must be the null character */ + sp = strtab->first; while (sp) { @@ -413,10 +402,10 @@ static void fputElf32_Ehdr (Elf32_Ehdr * ehdr, FILE * fp) { int i; - + for (i=0; ie_ident[i], fp); - + fputElf32_Half (ehdr->e_type, fp); fputElf32_Half (ehdr->e_machine, fp); fputElf32_Word (ehdr->e_version, fp); @@ -485,7 +474,7 @@ elfGenerateAbs (struct area *ap, listHeader * segments, listHeader * sections) { return; } - + ofs = 0; for (;;) { @@ -501,11 +490,11 @@ elfGenerateAbs (struct area *ap, listHeader * segments, listHeader * sections) while (ofs < ap->a_size && ap->a_used[ofs]) ofs++; size = ap->a_addr + ofs - addr; - + /* create a segment header for this region if loadable */ if (!(ap->a_flag & A_NOLOAD)) { - phdrp = new (sizeof (*phdrp)); + phdrp = new (sizeof (*phdrp)); phdrp->p_type = PT_LOAD; phdrp->p_offset = ftell (ofp); phdrp->p_vaddr = addr; @@ -518,9 +507,9 @@ elfGenerateAbs (struct area *ap, listHeader * segments, listHeader * sections) phdrp->p_align = 1; listAdd (segments, phdrp); } - + /* create a section header for this region */ - shdrp = new (sizeof (*shdrp)); + shdrp = new (sizeof (*shdrp)); shdrp->sh_name = strtabFindOrAdd (&shstrtab, ap->a_id); shdrp->sh_type = SHT_PROGBITS; shdrp->sh_flags = 0; @@ -536,9 +525,9 @@ elfGenerateAbs (struct area *ap, listHeader * segments, listHeader * sections) shdrp->sh_addralign = 0; shdrp->sh_entsize = 0; listAdd (sections, shdrp); - + fwrite (&ap->a_image[addr-ap->a_addr], 1, size, ofp); - } + } } /*--------------------------------------------------------------------------*/ @@ -549,7 +538,7 @@ elfGenerateRel (struct area *ap, listHeader * segments, listHeader * sections) { Elf32_Phdr * phdrp; Elf32_Shdr * shdrp; - + if (!ap->a_image) { return; @@ -558,7 +547,7 @@ elfGenerateRel (struct area *ap, listHeader * segments, listHeader * sections) /* create a segment header for this area if loadable */ if (!(ap->a_flag & A_NOLOAD)) { - phdrp = new (sizeof (*phdrp)); + phdrp = new (sizeof (*phdrp)); phdrp->p_type = PT_LOAD; phdrp->p_offset = ftell (ofp); phdrp->p_vaddr = ap->a_addr; @@ -571,9 +560,9 @@ elfGenerateRel (struct area *ap, listHeader * segments, listHeader * sections) phdrp->p_align = 1; listAdd (segments, phdrp); } - + /* create a section header for this area */ - shdrp = new (sizeof (*shdrp)); + shdrp = new (sizeof (*shdrp)); shdrp->sh_name = strtabFindOrAdd (&shstrtab, ap->a_id); shdrp->sh_type = SHT_PROGBITS; shdrp->sh_flags = 0; @@ -589,7 +578,7 @@ elfGenerateRel (struct area *ap, listHeader * segments, listHeader * sections) shdrp->sh_addralign = 0; shdrp->sh_entsize = 0; listAdd (sections, shdrp); - + fwrite (ap->a_image, 1, ap->a_size, ofp); } @@ -608,7 +597,7 @@ elfGenerate (void) listEntry * lep; int i; Elf32_Word shstrtabName; - + /* create the null section header for index 0 */ shdrp = new (sizeof (*shdrp)); shdrp->sh_name = 0; @@ -648,11 +637,11 @@ elfGenerate (void) ehdr.e_entry = 0; if (execStartMSBfound && execStartLSBfound) ehdr.e_entry = (execStartMSB << 8) + execStartLSB; - + /* Write out the ELF header as a placeholder; we will update */ /* it with the final values when everything is complete */ fputElf32_Ehdr (&ehdr, ofp); - + /* Iterate over the linker areas to generate */ /* the ELF sections and segments */ ap = areap; @@ -667,7 +656,7 @@ elfGenerate (void) } ap = ap->a_ap; } - + /* Create the string table section after the other sections */ shdrp = new (sizeof (*shdrp)); shdrp->sh_name = strtabFindOrAdd (&shstrtab, ".shstrtab"); @@ -682,7 +671,7 @@ elfGenerate (void) shdrp->sh_entsize = 0; listAdd (sections, shdrp); fputElfStrtab (&shstrtab, ofp); - + /* Find the index of the section string table */ /* header and save it in the ELF header */ ehdr.e_shstrndx = 0; @@ -696,7 +685,7 @@ elfGenerate (void) ehdr.e_shstrndx++; lep = lep->next; } - + /* Write out the segment headers */ ehdr.e_phnum = segments->count; ehdr.e_phoff = ftell (ofp); @@ -723,7 +712,7 @@ elfGenerate (void) /* over the placeholder header with the final values */ fseek (ofp, 0, SEEK_SET); fputElf32_Ehdr (&ehdr, ofp); - fseek (ofp, 0, SEEK_END); + fseek (ofp, 0, SEEK_END); } /*--------------------------------------------------------------------------*/ @@ -738,7 +727,7 @@ elf (int i) /* Buffer the data until we have it all */ if (i) - { + { if (hilo == 0) address = rtval[0] + (rtval[1] << 8); /* little endian order */ else @@ -760,7 +749,7 @@ elf (int i) ap->a_image[address-ap->a_addr] = rtval[i]; if (ap->a_used) ap->a_used[address-ap->a_addr] = 1; - + /* Make note of the reset vector */ if (!(ap->a_flag & A_NOLOAD)) { @@ -775,7 +764,7 @@ elf (int i) execStartLSBfound = 1; } } - address++; + address++; } } }