From 829667eafa493858c979f9f7e8ff23d07f80289c Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 14 Sep 2014 12:25:39 +0200 Subject: let sdbinutils know about Haiku. diff --git a/support/sdbinutils/bfd/config.bfd b/support/sdbinutils/bfd/config.bfd index 6d34c6d..5ae2396 100644 --- a/support/sdbinutils/bfd/config.bfd +++ b/support/sdbinutils/bfd/config.bfd @@ -853,6 +853,9 @@ case "${targ}" in targ_defvec=i386_elf32_vec targ_selvecs="iamcu_elf32_vec i386_pe_vec i386_pei_vec" ;; + i[3-7]86-*-haiku*) + targ_defvec=i386_elf32_vec + ;; i[3-7]86-*-interix*) targ_defvec=i386_pei_vec targ_selvecs="i386_pe_vec" -- 2.28.0 From a0d0065ff28aa8b5821aaa4656c8cbebc01d0a48 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 14 Sep 2014 12:26:14 +0200 Subject: Missing include. diff --git a/sim/ucsim/cmd.src/newcmdposixcl.h b/sim/ucsim/cmd.src/newcmdposixcl.h index b76fa1f..f6ba7d4 100644 --- a/sim/ucsim/cmd.src/newcmdposixcl.h +++ b/sim/ucsim/cmd.src/newcmdposixcl.h @@ -33,6 +33,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "newcmdcl.h" #include "cmdutil.h" +#include /* * Command fd console -- 2.28.0 From b38fb6711fbdf9cd381346848227e3e8ccb6d347 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 14 Sep 2014 12:59:31 +0200 Subject: strings.h fix. diff --git a/sim/ucsim/pobj.cc b/sim/ucsim/pobj.cc index dbf8d84..16775a2 100644 --- a/sim/ucsim/pobj.cc +++ b/sim/ucsim/pobj.cc @@ -29,6 +29,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include +#include #include "pstr.h" /*#include "pobjt.h"*/ -- 2.28.0 From 30925c99d430b10611c0617858f316221cdac777 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 15 Jan 2017 20:50:32 +0100 Subject: sdcpp: add missing include path diff --git a/support/cpp/configure.ac b/support/cpp/configure.ac index cbf4e07..34435cb 100644 --- a/support/cpp/configure.ac +++ b/support/cpp/configure.ac @@ -217,7 +217,7 @@ AC_FUNC_MMAP_FILE # We will need to find libiberty.h and ansidecl.h saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/libiberty -I${srcdir}/libcpp/include" +CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/../libiberty -I${srcdir}/libcpp/include -I${srcdir}/../sdbinutils/include" gcc_AC_CHECK_DECLS(getenv abort strsignal errno \ malloc realloc calloc free clock, , ,[ #include "ansidecl.h" -- 2.28.0 From dd2c3f9e753ef4b48b9ebe3f78eb0ccb0a8b3389 Mon Sep 17 00:00:00 2001 From: Gerasim Troeglazov <3dEyes@gmail.com> Date: Wed, 30 Sep 2020 19:00:21 +1000 Subject: Add x64 support diff --git a/support/sdbinutils/bfd/config.bfd b/support/sdbinutils/bfd/config.bfd index 5ae2396..52c91b0 100644 --- a/support/sdbinutils/bfd/config.bfd +++ b/support/sdbinutils/bfd/config.bfd @@ -811,6 +811,10 @@ case "${targ}" in want64=true targ_underscore=no ;; + x86_64-*-haiku*) + targ_defvec=x86_64_elf64_vec + want64=true + ;; x86_64-*-rdos*) targ_defvec=x86_64_elf64_vec want64=true -- 2.28.0 From 64c8f32ebb624c1b58a0ab5683eed7577d38a29d Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Fri, 22 Jan 2016 21:01:19 +0100 Subject: Import Kevin Thacker patch for runtime relocation support. diff --git a/sdas/linksrc/Makefile.in b/sdas/linksrc/Makefile.in index 43e16f5..e37b167 100644 --- a/sdas/linksrc/Makefile.in +++ b/sdas/linksrc/Makefile.in @@ -47,7 +47,7 @@ ASXXLIBSRC = strcmpi.c SRC = lk_readnl.c lkaomf51.c lkar.c lkarea.c lkdata.c lkelf.c lkeval.c \ lkhead.c lklex.c lklib.c lklibr.c lklist.c lkmain.c lkmem.c \ lknoice.c lkout.c lkrel.c lkrloc.c lkrloc3.c lks19.c lksdcclib.c \ - lksym.c sdld.c lksdcdb.c lkbank.c + lksym.c sdld.c lksdcdb.c lkbank.c lkrrel.c LKSOURCES = $(SRC) $(ASXXLIBSRC:%.c=$(ASXXLIB)/%.c) diff --git a/sdas/linksrc/aslink.h b/sdas/linksrc/aslink.h index ebad061..7dce058 100644 --- a/sdas/linksrc/aslink.h +++ b/sdas/linksrc/aslink.h @@ -1033,6 +1033,8 @@ extern int yflag; /* -y, enable SDCC Debug output */ #endif +extern int hflag; /* Generate relocatable executable + */ extern int pflag; /* print linker command file flag */ extern int uflag; /* Listing relocation flag diff --git a/sdas/linksrc/lkdata.c b/sdas/linksrc/lkdata.c index e03cd6a..db7c8ff 100644 --- a/sdas/linksrc/lkdata.c +++ b/sdas/linksrc/lkdata.c @@ -66,6 +66,9 @@ int oflag; /* Output file type flag int objflg; /* Linked file/library object output flag */ +int hflag; /* Generate relocatable executable + */ + #if NOICE int jflag; /* NoICE output flag */ diff --git a/sdas/linksrc/lkmain.c b/sdas/linksrc/lkmain.c index fcf7242..5535b95 100644 --- a/sdas/linksrc/lkmain.c +++ b/sdas/linksrc/lkmain.c @@ -233,6 +233,7 @@ main(int argc, char *argv[]) startp->f_idp = ""; pflag = 1; + hflag = 0; for(i=1; is_id); */ + if ((s[rindex]->s_axp->a_bap->a_flag & A4_ABS)==0) + { + output_relocation_record=1; + } + } + else + { + /* If the area is absolute then we do not output a record. + This allows us to reference absolute memory, but still the code + can be relocated. */ + /* If the area is relative, it refers to data that is part of the + relocatable program */ + + /* printf("Area: %s\n",a[rindex]->a_bap->a_id); */ + if ((a[rindex]->a_bap->a_flag & A4_ABS)==0) + { + output_relocation_record=1; + } + } + + if (output_relocation_record) + { + a_uint relocate_address = pc+(rtp-rtofst); + if (hilo) + { + raddr = reli + ((rtval[rtp]&0x0ff)<<8) + (rtval[rtp+1]&0x0ff); + } + else + { + raddr = reli + ((rtval[rtp+1]&0x0ff)<<8) + (rtval[rtp]&0x0ff); + } + /*printf("Relocation modify address: %04x\n",relocate_address); */ + /*printf("Relocation address: %04x\n",raddr); */ + if (mode & R3_BYTE) + { + if (mode & R3_BYTX) + { + if (mode & R3_MSB) + { + +relrec8hi(relocate_address,raddr); + } + else + { + +relrec8lo(relocate_address,raddr); + } + } + else + { + printf("not supported"); + } + } + else + { + if (mode & R3_BYTX) + { + if (mode & R3_MSB) + { + printf("not supported"); + } + else + { + printf("not supported"); + } + } + else + { + relrec16(relocate_address); + } + } + } + } /* pdk instruction fusion */ if (TARGET_IS_PDK) { @@ -856,6 +947,12 @@ rele3() if (uflag != 0) { lkulist(0); } + + /* output relocation data */ + if (hflag) { + relrecwrite(); + } + if (oflag != 0) { lkflush(); lkfclose(); diff --git a/sdas/linksrc/lkrrel.c b/sdas/linksrc/lkrrel.c new file mode 100644 index 0000000..e9e8383 --- /dev/null +++ b/sdas/linksrc/lkrrel.c @@ -0,0 +1,251 @@ +/* (c) Kevin Thacker, May 2005 */ +#include +#include +#include +#include "aslink.h" +#include "lkrrel.h" + +struct relrechead +{ + int count; + struct relrec *head; +}; + +/* 16-bit values, add full 16-bit base address */ + +static struct relrechead head16= {0,NULL}; +/* 8-bit, but add high byte of 16-bit base address */ +static struct relrechead head8hi = {0,NULL}; +/* 8-bit, but add low byte of 16-bit base address */ +static struct relrechead head8lo = {0,NULL}; + +/* internal; free's list */ +static void relrecfree(struct relrechead *head) +{ + struct relrec *cur = head->head; + + while (cur!=NULL) + { + struct relrec *next = cur->next; + free(cur); + + cur = next; + } +} + +/* free relocation record list; e.g. on exit */ +void freerelrec() +{ + relrecfree(&head16); + relrecfree(&head8hi); + relrecfree(&head8lo); +} + +/* internal; allocate a relocation record */ +static void newrelrec(struct relrechead *head, a_uint addr, a_uint symaddr) +{ + struct relrec *rec; + + rec = (struct relrec *) malloc(sizeof(struct relrec)); + + /* error if allocation failed */ + if (rec==NULL) + return; + + rec->addr = addr; + rec->symaddr = symaddr; + + /* add to start of list */ + rec->next = head->head; + head->head = rec; + head->count++; +} + +/* add item to 16-bit relocation record list */ +void relrec16(a_uint addr) +{ + newrelrec(&head16, addr,0); +} + +/* add item to 8-bit (high) relocation record list */ +void relrec8hi(a_uint addr, a_uint symaddr) +{ + newrelrec(&head8hi, addr,symaddr); +} + +/* add address to 8-bit (low) relocation list */ +void relrec8lo(a_uint addr, a_uint symaddr) +{ + newrelrec(&head8lo, addr,symaddr); +} + +/* internal; compare two addresses within two relocate records */ +static int relreccompare(const void *a, const void *b) +{ + const struct relrec *relreca = (const struct relrec *)a; + const struct relrec *relrecb = (const struct relrec *)b; + + return (relreca->addr-relrecb->addr); +} + +/* sort a list of relocate records and return an array of the records */ +static struct relrec *relrecsort(struct relrechead *head) +{ + int count; + struct relrec *reclist; + struct relrec *cur; + + if (head->count==0) + return NULL; + + /* allocate list to hold all items */ + reclist = (struct relrec *)malloc(sizeof(struct relrec)*head->count); + + if (reclist==NULL) + return NULL; + + /* fill list */ + count = 0; + cur = head->head; + while (cur!=NULL) + { + memcpy(&reclist[count],cur,sizeof(struct relrec)); + count++; + cur = cur->next; + } + + /* sort into ascending address order */ + qsort(reclist, count, sizeof(struct relrec),relreccompare); + + return reclist; +} + +int outbyte(int addr, char byte) +{ + rtval[0] = addr&0x0ff; + rtval[1] = (addr>>8)&0x0ff; + rtval[2] = byte&0x0ff; + addr+=1; + rtflg[0] = 1; + rtflg[1] = 1; + rtflg[2] = 1; + rtcnt = 3; + ixx(1); + return addr; +} + +void relrecwritelist1(struct relrechead *list,int *addrptr) +{ + int i; + struct relrec *relreclist; + int addr; + + addr = *addrptr; + + relreclist = relrecsort(list); + + if (relreclist!=NULL) + { + int prevaddr = 0; + for (i=0; icount; i++) + { + struct relrec *cur = &relreclist[i]; + + int delta = cur->addr-prevaddr; + + if (delta>254) + { + int largedelta = delta-1; + addr = outbyte(addr,0x0ff); + addr = outbyte(addr,largedelta&0x0ff); + addr = outbyte(addr,(largedelta>>8)&0x0ff); + delta = 1; + } + prevaddr = cur->addr; + addr = outbyte(addr,delta&0x0ff); + } + + free(relreclist); + } + + addr = outbyte(addr, 0); + + *addrptr = addr; + +} + +void relrecwritelist2(struct relrechead *list,int *addrptr) +{ + int i; + struct relrec *relreclist; + int addr; + + addr = *addrptr; + + relreclist = relrecsort(list); + + if (relreclist!=NULL) + { + int prevaddr = 0; + for (i=0; icount; i++) + { + struct relrec *cur = &relreclist[i]; + int delta = cur->addr-prevaddr; + prevaddr = cur->addr; + + if (delta>254) + { + int largedelta = delta-1; + addr = outbyte(addr,0x0ff); + addr = outbyte(addr,largedelta&0x0ff); + addr = outbyte(addr,(largedelta>>8)&0x0ff); + delta = 1; + } + + addr = outbyte(addr,delta&0x0ff); + addr = outbyte(addr,cur->symaddr&0x0ff); + } + + free(relreclist); + } + + addr = outbyte(addr,0); + + *addrptr = addr; + +} + + +void relrecwrite() +{ + int areasize = 0; + + struct area *cur = areap; + while (cur!=NULL) + { + areasize+=cur->a_size; + cur=cur->a_ap; + } + + //printf("total length before relocation records: %04x\n",areasize); + + /* re-write offset to relocation records */ + rtval[0] = 0; + rtval[1] = 0; + rtval[2] = areasize&0x0ff; + rtval[3] = (areasize>>8)&0x0ff; + rtflg[0] = 1; + rtflg[1] = 1; + rtflg[2] = 1; + rtflg[3] = 1; + rtcnt = 4; + ixx(1); + + + int addr = areasize; + + + relrecwritelist1(&head16,&addr); + relrecwritelist1(&head8lo,&addr); + relrecwritelist2(&head8hi,&addr); +} diff --git a/sdas/linksrc/lkrrel.h b/sdas/linksrc/lkrrel.h new file mode 100644 index 0000000..ca1cfd4 --- /dev/null +++ b/sdas/linksrc/lkrrel.h @@ -0,0 +1,17 @@ +/* relocation record */ +struct relrec +{ + /* next item */ + struct relrec *next; + + /* address of relocate */ + a_uint addr; + + a_uint symaddr; +}; + +void relrec16(a_uint addr); +void relrec8lo(a_uint addr, a_uint symaddr); +void relrec8hi(a_uint addr, a_uint symaddr); +void freerelrec(); +void relrecwrite(); -- 2.28.0