/* aslink.h */ /* * Copyright (C) 1989-2012 Alan R. Baldwin * * 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 of the License, 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * Alan R. Baldwin * 721 Berkeley St. * Kent, Ohio 44240 * * With enhancements from * John L. Hartman (JLH) * jhartman@compuserve.com */ /* * System Include Files */ #include #include #include #include "sdld.h" /* * Local Definitions */ #define VERSION "V03.00 + NoICE + sdld" #define COPYRIGHT "2012" /* * To include NoICE Debugging set non-zero */ #define NOICE 1 /* * To include SDCC Debugging set non-zero */ #define SDCDB 1 /* * The assembler requires certain variables to have * at least 32 bits to allow correct address processing. * * The type INT32 is defined so that compiler dependent * variable sizes may be specified in one place. * * LONGINT is defined when INT32 is 'long' to * select the 'l' forms for format strings. */ /* Turbo C++ 3.0 for DOS */ /* 'int' is 16-bits, 'long' is 32-bits */ #ifdef __TURBOC__ #define INT32 long #define LONGINT #endif /* Symantec C++ V6.x/V7.x for DOS (not DOSX) */ /* 'int' is 16-bits, 'long' is 32-bits */ #ifdef __SC__ #define INT32 long #define LONGINT #endif /* The DEFAULT is 'int' is 32 bits */ #ifndef INT32 #define INT32 int #endif /*)Module aslink.h * * The module aslink.h contains the definitions for constants, * structures, global variables, and LKxxxx functions * contained in the LKxxxx.c files. */ /*)BUILD $(PROGRAM) = ASLINK $(INCLUDE) = ASLINK.H $(FILES) = { LKMAIN.C LKLEX.C LKAREA.C LKBANK.C LKHEAD.C LKSYM.C LKEVAL.C LKDATA.C LKLIST.C LKNOICE.C LKSDCDB.C LKRLOC.C LKRLOC3.C LKLIBR.C LKOUT.C LKS19.C } $(STACK) = 2000 */ #if defined DECUS /* DECUS C void definition */ /* File/extension seperator */ #define VOID char #define FSEPX '.' #elif defined PDOS /* PDOS C void definition */ /* File/extension seperator */ #define VOID char #define FSEPX ':' #elif defined UNIX /* UNIX void definition */ /* File/extension seperator */ #define VOID void #define FSEPX '.' #define LKDIRSEP '/' #define LKDIRSEPSTR "/" #define OTHERSYSTEM #else /* DOS/WINDOWS void definition */ /* File/extension seperator */ #define VOID void #define FSEPX '.' #define LKDIRSEP '\\' #define LKDIRSEPSTR "\\" #define OTHERSYSTEM #endif /* * PATH_MAX */ #include #ifndef PATH_MAX /* POSIX, but not required */ #if defined(__BORLANDC__) || defined(_MSC_VER) #include #define PATH_MAX _MAX_PATH #elif defined(__x86_64__) #define PATH_MAX 4096 #else #define PATH_MAX 255 /* define a reasonable value */ #endif #endif #ifdef _WIN32 /* WIN32 native */ # define NATIVE_WIN32 1 # ifdef __MINGW32__ /* GCC MINGW32 depends on configure */ # include "../../sdccconf.h" # else # include "../../sdcc_vc.h" # define PATH_MAX _MAX_PATH # endif #else /* Assume *nix style system */ # include "../../sdccconf.h" #endif #define LKOBJEXT "rel" /* * Global symbol types. */ #define S_REF 1 /* referenced */ #define S_DEF 2 /* defined */ /* * File types */ #define F_OUT 0 /* File.ixx / File.sxx */ #define F_STD 1 /* stdin */ #define F_LNK 2 /* File.lnk */ #define F_REL 3 /* File.rel */ /* * Error definitions */ #define ER_NONE 0 /* No error */ #define ER_WARNING 1 /* Warning */ #define ER_ERROR 2 /* Assembly error */ #define ER_FATAL 3 /* Fatal error */ /* * This file defines the format of the * relocatable binary file. */ #define NCPS PATH_MAX /* characters per symbol */ #define NINPUT PATH_MAX /* Input buffer size */ #define NHASH (1 << 6) /* Buckets in hash table */ #define HMASK (NHASH - 1) /* Hash mask */ #define NLPP 60 /* Lines per page */ #define NMAX 78 /* IXX/SXX/DBX Buffer Length */ #define IXXMAXBYTES 32 /* NMAX > (2 * IXXMAXBYTES) */ #define SXXMAXBYTES 32 /* NMAX > (2 * SXXMAXBYTES) */ #define DBXMAXBYTES 64 /* NMAX > ( DBXMAXBYTES ) */ #define FILSPC PATH_MAX /* File spec length */ #define NDATA 16 /* actual data */ /* * NTXT must be defined to have the same value in * the ASxxxx assemblers and ASLink. * * The R Line coding allows only 4-bits for coding * the T Line index. The MAXIMUM value for NTXT * is 16. It should not be changed. */ #define NTXT 16 /* T values */ /* * Opcode Cycle definitions (Must Be The Same In ASxxxx / ASLink) */ #define CYCNT_BGN '[' /* Cycle count begin delimiter */ #define CYCNT_END ']' /* Cycle count end delimiter */ /* * Internal ASxxxx Version Variable */ extern int ASxxxx_VERSION; /* * ASLINK - Version 3 Definitions */ /* * The "A3_" area constants define values used in * generating the assembler area output data. * * Area flags * * 7 6 5 4 3 2 1 0 * +-----+-----+-----+-----+-----+-----+-----+-----+ * | | | | PAG | ABS | OVR | | | * +-----+-----+-----+-----+-----+-----+-----+-----+ */ #define A3_CON 000 /* concatenate */ #define A3_OVR 004 /* overlay */ #define A3_REL 000 /* relocatable */ #define A3_ABS 010 /* absolute */ #define A3_NOPAG 000 /* non-paged */ #define A3_PAG 020 /* paged */ /* sdld specific */ /* Additional flags for 8051 address spaces */ #define A_DATA 0000 /* data space (default)*/ #define A_CODE 0040 /* code space */ #define A_XDATA 0100 /* external data space */ #define A_BIT 0200 /* bit addressable space */ /* Additional flags for hc08 */ #define A_NOLOAD 0400 /* nonloadable */ #define A_LOAD 0000 /* loadable (default) */ /* end sdld specific */ /* * The "R3_" relocation constants define values used in * generating the assembler relocation output data for * areas, symbols, and code. * * * Relocation types. * * 7 6 5 4 3 2 1 0 * +-----+-----+-----+-----+-----+-----+-----+-----+ * | MSB | PAGn| PAG0| USGN| BYT2| PCR | SYM | BYT | * +-----+-----+-----+-----+-----+-----+-----+-----+ */ #define R3_WORD 0x00 /* 16 bit */ #define R3_BYTE 0x01 /* 8 bit */ #define R3_AREA 0x00 /* Base type */ #define R3_SYM 0x02 #define R3_NORM 0x00 /* PC adjust */ #define R3_PCR 0x04 #define R3_BYT1 0x00 /* Byte count for R_BYTE = 1 */ #define R3_BYTX 0x08 /* Byte count for R_BYTE = X */ #define R3_SGND 0x00 /* Signed value */ #define R3_USGN 0x10 /* Unsigned value */ #define R3_NOPAG 0x00 /* Page Mode */ #define R3_PAG0 0x20 /* Page '0' */ #define R3_PAG 0x40 /* Page 'nnn' */ #define R3_LSB 0x00 /* output low byte */ #define R3_MSB 0x80 /* output high byte */ /* * Additional "R3_" functionality is required to support * some microprocesssor architectures. The 'illegal' * "R3_" mode of R3_WORD | R3_BYTX is used as a designator * of the extended R3_ modes. The extended modes replace * the PAGING modes and are being added in an adhoc manner * as follows: * * Extended Mode relocation flags * * 7 6 5 4 3 2 1 0 * +-----+-----+-----+-----+-----+-----+-----+-----+ * | MSB | x | x | USGN| 1 | PCR | SYM | 0 | * +-----+-----+-----+-----+-----+-----+-----+-----+ */ #define R3_ECHEK 0011 /* Extended Mode Check Bits */ #define R3_EXTND 0010 /* Extended Mode Code */ #define R3_EMASK 0151 /* Extended Mode Mask */ /* #define R3_AREA 0000 */ /* Base type */ /* #define R3_SYM 0002 */ /* #define R3_NORM 0000 */ /* PC adjust */ /* #define R3_PCR 0004 */ /* #define R3_SGND 0000 */ /* Signed value */ /* #define R3_USGN 0020 */ /* Unsigned value */ /* #define R3_LSB 0000 */ /* output low byte */ /* #define R3_MSB 0200 */ /* output high byte */ #define R3_J11 (R3_WORD|R3_BYTX) /* JLH: 11 bit JMP and CALL (8051) */ #define R3_J19 (R3_WORD|R3_BYTX|R3_MSB) /* BM: 19 bit JMP and CALL (DS80C390) */ #define R_C24 (R3_WORD|R3_BYT1|R3_MSB) /* 24 bit address (DS80C390) */ #define R_J19_MASK (R3_BYTE|R3_BYTX|R3_MSB) #define IS_R_J19(x) (((x) & R_J19_MASK) == R3_J19) #define IS_R_J11(x) (((x) & R_J19_MASK) == R3_J11) #define IS_C24(x) (((x) & R_J19_MASK) == R_C24) /* sdld specific */ #define R_BYT3 0x100 /* if R3_BYTE is set, this is a * 3 byte address, of which * the linker must select one byte. */ #define R_HIB 0x200 /* If R3_BYTE & R_BYT3 are set, linker * will select byte 3 of the relocated * 24 bit address. */ #define R_BIT 0x400 /* Linker will convert from byte-addressable * space to bit-addressable space. */ #define R_ESCAPE_MASK 0xf0 /* Used to escape relocation modes * greater than 0xff in the .rel * file. */ /* end sdld specific */ /* * ASLINK - Version 4 Definitions */ /* * The "A4_" area constants define values used in * generating the assembler area output data. * * Area flags * * 7 6 5 4 3 2 1 0 * +-----+-----+-----+-----+-----+-----+-----+-----+ * | BNK | SEG | | PAG | ABS | OVR | WL1 | WL0 | * +-----+-----+-----+-----+-----+-----+-----+-----+ */ #define A4_BYTE 0x0000 /* 8 bit */ #define A4_WORD 0x0001 /* 16 bit */ #define A4_1BYTE 0x0000 /* 1 Byte Word Length */ #define A4_2BYTE 0x0001 /* 2 Byte Word Length */ #define A4_3BYTE 0x0002 /* 3 Byte Word Length */ #define A4_4BYTE 0x0003 /* 4 Byte Word Length */ #define A4_WLMSK 0x0003 /* Word Length Mask */ #define A4_CON 0x0400 /* Concatenating */ #define A4_OVR 0x0404 /* Overlaying */ #define A4_REL 0x0800 /* Relocatable */ #define A4_ABS 0x0808 /* absolute */ #define A4_NOPAG 0x1000 /* Non-Paged */ #define A4_PAG 0x1010 /* Paged */ #define A4_CSEG 0x4000 /* CSEG */ #define A4_DSEG 0x4040 /* DSEG */ #define A4_NOBNK 0x8000 /* Non-Banked */ #define A4_BNK 0x8080 /* Banked */ #define A4_OUT 0x0100 /* Output Code Flag */ /* * The "R4_" relocation constants define values used in * generating the assembler relocation output data for * areas, symbols, and code. * * Note: The PAGE modes, PCR modes, Signed, Unsigned, * and MSB codes are mutually exclusive !!! * * * Relocation flags * * 7 6 5 4 3 2 1 0 * +-----+-----+-----+-----+-----+-----+-----+-----+ * | SYM | PCR | PAGn| PAG0| USGN| SGND| BYT1| BYT0| * +-----+-----+-----+-----+-----+-----+-----+-----+ */ #define R4_BYTE 0x0000 /* 8 bit */ #define R4_WORD 0x0001 /* 16 bit */ #define R4_1BYTE 0x0000 /* 1 Byte */ #define R4_2BYTE 0x0001 /* 2 Byte */ #define R4_3BYTE 0x0002 /* 3 Byte */ #define R4_4BYTE 0x0003 /* 4 Byte */ #define R4_BYTES 0x0003 /* Data Size */ #define R4_SGND 0x0004 /* Signed */ #define R4_USGN 0x0008 /* Unsigned */ #define R4_OVRF 0x0008 /* Overflow */ #define R4_MBRS 0x0004 /* Merge Bit Range Signed */ /* An alias for Signed */ #define R4_MBRU 0x0008 /* Merge Bit Range Unsigned */ /* An alias for Unsigned */ #define R4_MBRO 0x0008 /* Merge Bit Range Overflow */ /* An alias for Unsigned */ #define R4_MSB 0x000C /* MSB */ /* Mutually exclusive with Signed / Unsigned */ #define R4_AREA 0x0000 /* Base type */ #define R4_SYM 0x0080 /* * Paging Modes: */ #define R4_NOPAG 0x0000 /* Page Mode */ #define R4_PBITS 0x003C /* Paging Bits */ #define R4_PAGE 0x0030 /* Paged Addressing */ #define R4_PAG0 0x0010 /* Page '0' .setdp */ #define R4_PAGN 0x0020 /* Page 'nnn' .setdp */ #define R4_PAGX 0x0030 /* Page 'x', Extended Relocation Mode */ #define R4_PAGX0 0x0030 /* Page 'x', pc + 0 */ #define R4_PAGX1 0x0034 /* Page 'x', pc + 1 */ #define R4_PAGX2 0x0038 /* Page 'x', pc + 2 */ #define R4_PAGX3 0x003C /* Page 'x', pc + 3 */ /* * PCR Modes: */ #define R4_PCR 0x0040 /* PC adjust (default) */ #define R4_PCRN 0x0050 /* PC adjust (default) no range check */ #define R4_PCR0 0x0054 /* PC adjust (offset = 0) */ #define R4_PCR1 0x0060 /* PC adjust (offset = 1) */ #define R4_PCR2 0x0064 /* PC adjust (offset = 2) */ #define R4_PCR3 0x0068 /* PC adjust (offset = 3) */ #define R4_PCR4 0x006C /* PC adjust (offset = 4) */ #define R4_PCR0N 0x0058 /* PC adjust (offset = 0) no range check */ #define R4_PCR1N 0x0070 /* PC adjust (offset = 1) no range check */ #define R4_PCR2N 0x0074 /* PC adjust (offset = 2) no range check */ #define R4_PCR3N 0x0078 /* PC adjust (offset = 3) no range check */ #define R4_PCR4N 0x007C /* PC adjust (offset = 4) no range check */ /* * Basic Relocation Modes */ #define R4_NORM 0x0000 /* No Bit Positioning */ /* * The defined type 'a_uint' is used for all address and * unsigned variable value calculations. Its size is * required to be at least 32-bits to allow upto * 32-bit addressing or 32-bit value manipulation. */ typedef unsigned INT32 a_uint; /* * The defined type 'v_sint' is used for address and * variable value calculations requiring a sign. * Its size is required to be at least 32-bits to allow * upto 32-bit addressing or 32-bit value manipulation. */ typedef signed INT32 v_sint; /* * The structures of head, mode, bank, area, areax, and sym * are created as the REL files are read during the first * pass of the linker. The struct head is created upon * encountering a H directive in the REL file. The * structure contains a link to a link file structure * (struct lfile) which describes the file containing the H * directive, a pointer to an array of merge mode * definition pointers, the number of data/code areas * contained in this header segment, the number of * symbols referenced/defined in this header segment, a pointer * to an array of pointers to areax structures (struct areax) * created as each A directive is read, a pointer to an * array of pointers to symbol structures (struct sym) for * all referenced/defined symbols and a pointer to an array * of pointers to bank structures (struct bank) referenced * by this module. As H directives are read * from the REL files a linked list of head structures is * created by placing a link to the new head structure * in the previous head structure. */ struct head { struct head *h_hp; /* Header link */ struct lfile *h_lfile; /* Associated file */ int h_narea; /* # of areas */ struct areax **a_list; /* Area list */ int h_nsym; /* # of symbols */ struct sym **s_list; /* Symbol list */ int h_nbank; /* # of banks */ struct bank **b_list; /* Bank list */ int h_nmode; /* # of modes */ struct mode **m_list; /* Mode list */ char * m_id; /* Module name */ }; /* * The MODE structure contains the specification of one of the * assemblers' relocation modes. Each assembler must specify * at least one relocation mode. The relocation specification * allows arbitrarily defined active bits and bit positions. * The 32 element arrays are indexed from 0 to 31. * Index 0 corresponds to bit 0, ..., and 31 corresponds to bit 31 * of a normal integer value. * * The value an array element defines if the normal integer bit is * active (bit <7> is set, 0x80) and what destination bit * (bits <4:0>, 0 - 31) should be loaded with this normal * integer bit. * * The specification for a 32-bit integer: * * char mode_[32] = { * 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, * 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, * 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, * 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F * }; * * * The specification for the 11-bit 8051 addressing mode: * * char mode_[32] = { * 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, * 0x8D, 0x8E, 0x8F, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, * 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, * 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F * }; * * * m_def is the bit relocation definition array. * m_flag indicates that bit position swapping is required. * m_dbits contains the active bit positions for the output. * m_sbits contains the active bit positions for the input. */ struct mode { char m_def[32]; /* Bit Relocation Definition */ int m_flag; /* Bit Swapping Flag */ a_uint m_dbits; /* Destination Bit Mask */ a_uint m_sbits; /* Source Bit Mask */ }; /* * The bank structure contains the parameter values for a * specific program or data bank. The bank structure * is a linked list of banks. The initial default bank * is unnamed and is defined in lkdata.c, the next bank structure * will be linked to this structure through the structure * element 'struct bank *b_bp'. The structure contains the * bank name, the bank base address (default = 0), the bank size * (default = 0, whole addressing space), the bank mapping, * and the file name suffix. (default is none) These optional * parameters are from the .bank assembler directive. * The bank structure also contains the bank data output * file specification, file handle pointer and the * bank first output flag. */ struct bank { struct bank *b_bp; /* Bank link */ char * b_id; /* Bank Name */ char * b_fsfx; /* Bank File Suffix / File Specification */ a_uint b_base; /* Bank base address */ a_uint b_size; /* Bank size */ a_uint b_map; /* Bank mapping */ int b_flag; /* Bank flags */ char * b_fspec; /* Bank File Specification */ FILE * b_ofp; /* Bank File Handle */ char * b_ofspec; /* Bank Output File Specification */ int b_oflag; /* Bank has output flag */ int b_rtaflg; /* Bank First Output flag */ }; #define B_BASE 0001 /* 'base' address specified */ #define B_SIZE 0002 /* 'size' of bank specified */ #define B_FSFX 0004 /* File suffix specified */ #define B_MAP 0010 /* Mapped Bank Flag */ /* * A structure area is created for each 'unique' data/code * area definition found as the REL files are read. The * struct area contains the name of the area, a flag byte * which contains the area attributes (REL/CON/OVR/ABS), * the area base address set flag byte (-b option), and the * area base address and total size which will be filled * in at the end of the first pass through the REL files. * The area structure also contains a link to the bank * this area is a part of and a data output file handle * pointer which is loaded from from the bank structure. * As A directives are read from the REL files a linked * list of unique area structures is created by placing a * link to the new area structure in the previous area structure. */ struct area { struct area *a_ap; /* Area link */ struct areax *a_axp; /* Area extension link */ struct bank *a_bp; /* Bank link */ FILE * a_ofp; /* Area File Handle */ a_uint a_addr; /* Beginning address of area */ a_uint a_size; /* Total size of the area */ int a_bset; /* Area base address set */ /* sdld specific */ a_uint a_unaloc; /* Total number of unallocated bytes, for error reporting */ /* end sdld specific */ int a_flag; /* Flags */ char * a_id; /* Name */ /* sdld specific */ char *a_image; /* Something for hc08/lkelf */ char *a_used; /* Something for hc08/lkelf */ a_uint a_imagesize; /* Something for hc08/lkelf */ /* end sdld specific */ }; /* * An areax structure is created for every A directive found * while reading the REL files. The struct areax contains a * link to the 'unique' area structure referenced by the A * directive and to the head structure this area segment is * a part of. The size of this area segment as read from the * A directive is placed in the areax structure. The beginning * address of this segment will be filled in at the end of the * first pass through the REL files. As A directives are read * from the REL files a linked list of areax structures is * created for each unique area. The final areax linked * list has at its head the 'unique' area structure linked * to the linked areax structures (one areax structure for * each A directive for this area). */ struct areax { struct areax *a_axp; /* Area extension link */ struct area *a_bap; /* Base area link */ struct head *a_bhp; /* Base header link */ a_uint a_addr; /* Beginning address of section */ a_uint a_size; /* Size of the area in section */ }; /* * A sym structure is created for every unique symbol * referenced/defined while reading the REL files. The * struct sym contains the symbol's name, a flag value * (not used in this linker), a symbol type denoting * referenced/defined, and an address which is loaded * with the relative address within the area in which * the symbol was defined. The sym structure also * contains a link to the area where the symbol was defined. * The sym structures are linked into linked lists using * the symbol link element. */ struct sym { struct sym *s_sp; /* Symbol link */ struct areax *s_axp; /* Symbol area link */ char s_type; /* Symbol subtype */ char s_flag; /* Flag byte */ a_uint s_addr; /* Address */ char *s_id; /* Name (JLH) */ char *m_id; /* Module symbol define in */ }; /* * The structure lfile contains a pointer to a * file specification string, an index which points * to the file name (past the 'path'), the file type, * an object output flag, and a link to the next * lfile structure. */ struct lfile { struct lfile *f_flp; /* lfile link */ int f_type; /* File type */ char *f_idp; /* Pointer to file spec */ int f_idx; /* Index to file name */ int f_obj; /* Object output flag */ }; /* * The struct base contains a pointer to a * base definition string and a link to the next * base structure. */ struct base { struct base *b_base; /* Base link */ char *b_strp; /* String pointer */ }; /* * The struct globl contains a pointer to a * global definition string and a link to the next * global structure. */ struct globl { struct globl *g_globl; /* Global link */ char *g_strp; /* String pointer */ }; /* * A structure sdp is created for each 'unique' paged * area definition found as the REL files are read. * As P directives are read from the REL files a linked * list of unique sdp structures is created by placing a * link to the new sdp structure in the previous area structure. */ struct sdp { struct area *s_area; /* Paged Area link */ struct areax *s_areax; /* Paged Area Extension Link */ a_uint s_addr; /* Page address offset */ }; /* * The structure rerr is loaded with the information * required to report an error during the linking * process. The structure contains an index value * which selects the areax structure from the header * areax structure list, a mode value which selects * symbol or area relocation, the base address in the * area section, an area/symbol list index value, and * an area/symbol offset value. */ struct rerr { int aindex; /* Linking area */ int mode; /* Relocation mode */ a_uint rtbase; /* Base address in section */ int rindex; /* Area/Symbol reloaction index */ a_uint rval; /* Area/Symbol offset value */ }; /* * The structure lbpath is created for each library * path specification input by the -k option. The * lbpath structures are linked into a list using * the next link element. */ struct lbpath { struct lbpath *next; char *path; }; /* * The structure lbname is created for all combinations of the * library path specifications (input by the -k option) and the * library file specifications (input by the -l option) that * lead to an existing file. The element path points to * the path string, element libfil points to the library * file string, and the element libspc is the concatenation * of the valid path and libfil strings. * * The lbpath structures are linked into a list * using the next link element. * * Each library file contains a list of object files * that are contained in the particular library. e.g.: * * \iolib\termio * \inilib\termio * * Only one specification per line is allowed. */ struct lbname { struct lbname *next; char *path; char *libfil; char *libspc; int f_obj; }; /* * The function fndsym() searches through all combinations of the * library path specifications (input by the -k option) and the * library file specifications (input by the -l option) that * lead to an existing file for a symbol definition. * * The structure lbfile is created for the first library * object file which contains the definition for the * specified undefined symbol. * * The element libspc points to the library file path specification * and element relfil points to the object file specification string. * The element filspc is the complete path/file specification for * the library file to be imported into the linker. The f_obj * flag specifies if the object code from this file is * to be output by the linker. The file specification * may be formed in one of two ways: * * (1) If the library file contained an absolute * path/file specification then this becomes filspc. * (i.e. C:\...) * * (2) If the library file contains a relative path/file * specification then the concatenation of the path * and this file specification becomes filspc. * (i.e. \...) * * The lbpath structures are linked into a list * using the next link element. */ struct lbfile { struct lbfile *next; char *libspc; char *relfil; char *filspc; int f_obj; /* sdld specific */ long offset; unsigned int type; /* end sdld specific */ }; /* * External Definitions for all Global Variables */ extern char *_abs_; /* = { ". .ABS." }; */ extern int lkerr; /* ASLink error flag */ extern char *ip; /* pointer into the REL file * text line in ib[] */ extern char ib[NINPUT]; /* REL file text line */ extern char *rp; /* pointer into the LST file * text line in rb[] */ extern char rb[NINPUT]; /* LST file text line being * address relocated */ extern char ctype[]; /* array of character types, one per * ASCII/OEM character */ /* * Character Type Definitions */ #define SPACE '\000' #define ETC '\000' #define LETTER '\001' #define DIGIT '\002' #define BINOP '\004' #define RAD2 '\010' #define RAD8 '\020' #define RAD10 '\040' #define RAD16 '\100' #define ILL '\200' #define DGT2 DIGIT|RAD16|RAD10|RAD8|RAD2 #define DGT8 DIGIT|RAD16|RAD10|RAD8 #define DGT10 DIGIT|RAD16|RAD10 #define LTR16 LETTER|RAD16 extern char afspec[]; /* The filespec created by afile() */ extern char ccase[]; /* an array of characters which * perform the case translation function */ extern struct lfile *filep; /* The pointers (lfile *) filep, * (lfile *) cfp, and (FILE *) sfp * are used in conjunction with * the routine nxtline() to read * aslink commands from * (1) the standard input or * (2) or a command file * and to read the REL files * sequentially as defined by the * aslink input commands. * * The pointer *filep points to the * beginning of a linked list of * lfile structures. */ extern struct lfile *cfp; /* The pointer *cfp points to the * current lfile structure */ extern struct lfile *startp;/* aslink startup file structure */ extern struct lfile *linkp; /* pointer to first lfile structure * containing an input REL file * specification */ extern struct lfile *lfp; /* pointer to current lfile structure * being processed by parse() */ extern struct head *headp; /* The pointer to the first * head structure of a linked list */ extern struct head *hp; /* Pointer to the current * head structure */ extern struct bank *bankp; /* The pointer to the first * bank structure of a linked list */ extern struct bank *bp; /* Pointer to the current * bank structure */ extern struct area *areap; /* The pointer to the first * area structure of a linked list */ extern struct area *ap; /* Pointer to the current * area structure */ extern struct areax *axp; /* Pointer to the current * areax structure */ extern struct sym *symhash[NHASH]; /* array of pointers to NHASH * linked symbol lists */ extern struct base *basep; /* The pointer to the first * base structure */ extern struct base *bsp; /* Pointer to the current * base structure */ extern struct globl *globlp;/* The pointer to the first * globl structure */ extern struct globl *gsp; /* Pointer to the current * globl structure */ extern struct sdp sdp; /* Base Paged structure */ extern struct rerr rerr; /* Structure containing the * linker error information */ extern FILE *nbofp; /* Non Banked Linker Output * File Handle */ extern FILE *ofp; /* Linker Output file handle */ #if NOICE extern FILE *jfp; /* NoICE output file handle */ #endif extern FILE *mfp; /* Map output file handle */ extern FILE *rfp; /* File handle for output * address relocated ASxxxx * listing file */ extern FILE *sfp; /* The file handle sfp points to the * currently open file */ extern FILE *tfp; /* File handle for input * ASxxxx listing file */ #if SDCDB extern FILE *yfp; /* SDCDB output file handle */ #endif extern int oflag; /* Output file type flag */ extern int objflg; /* Linked file/library object output flag */ #if NOICE extern int jflag; /* -j, enable NoICE Debug output */ #endif extern int mflag; /* Map output flag */ extern int xflag; /* Map file radix type flag */ #if SDCDB extern int yflag; /* -y, enable SDCC Debug output */ #endif extern int pflag; /* print linker command file flag */ extern int uflag; /* Listing relocation flag */ extern int wflag; /* Enable wide format listing */ extern int zflag; /* Disable symbol case sensitivity */ extern int radix; /* current number conversion radix: * 2 (binary), 8 (octal), 10 (decimal), * 16 (hexadecimal) */ extern int line; /* current line number */ extern int page; /* current page number */ extern int lop; /* current line number on page */ extern int pass; /* linker pass number */ extern a_uint pc; /* current relocation address */ extern int pcb; /* current bytes per pc word */ extern int rtcnt; /* count of elements in the * rtval[] and rtflg[] arrays */ extern a_uint rtval[]; /* data associated with relocation */ extern int rtflg[]; /* indicates if rtval[] value is * to be sent to the output file. */ extern int rterr[]; /* indicates if rtval[] value should * be flagged as a relocation error. */ extern char rtbuf[]; /* S19/IHX output buffer */ extern struct bank *rtabnk; /* rtbuf[] processing */ extern int rtaflg; /* rtbuf[] processing */ extern a_uint rtadr0; /* */ extern a_uint rtadr1; /* */ extern a_uint rtadr2; /* */ extern int obj_flag; /* Linked file/library object output flag */ extern int a_bytes; /* REL file T Line address length */ extern int hilo; /* REL file byte ordering */ extern a_uint a_mask; /* Address Mask */ extern a_uint s_mask; /* Sign Mask */ extern a_uint v_mask; /* Value Mask */ extern int gline; /* LST file relocation active * for current line */ extern int gcntr; /* LST file relocation active * counter */ extern struct lbpath *lbphead; /* pointer to the first * library path structure */ extern struct lbname *lbnhead; /* pointer to the first * library name structure */ extern struct lbfile *lbfhead; /* pointer to the first * library file structure */ /* sdld specific */ extern int sflag; /* JCF: Memory usage output flag */ extern int packflag; /* Pack data memory flag */ extern int stacksize; /* Stack size */ extern int rflag; /* Extended linear address record flag. */ extern a_uint iram_size; /* internal ram size */ extern long xram_size; /* external ram size */ extern long code_size; /* code size */ extern char *sdld_output; /* output file name, --output argument */ extern char *optsdcc; extern char *optsdcc_module; /* sdld 8015 specific */ extern char idatamap[256]; /* space is unused */ /* end sdld 8051 specific */ /* end sdld specific */ /* C Library function definitions */ /* for reference only extern VOID exit(); extern int fclose(); extern char * fgets(); extern FILE * fopen(); extern int fprintf(); extern VOID free(); extern VOID * malloc(); extern char putc(); extern char * sprintf(); extern char * strcpy(); extern int strlen(); extern char * strncpy(); extern char * strrchr(); */ /* Program function definitions */ #ifdef OTHERSYSTEM /* lkmain.c */ extern FILE * afile(char *fn, char *ft, int wf); extern VOID bassav(void); extern int fndidx(char *str); extern int fndext(char *str); extern VOID gblsav(void); extern int intsiz(void); extern VOID iramsav(void); extern VOID xramsav(void); extern VOID codesav(void); extern VOID iramcheck(void); extern VOID link_main(void); extern VOID lkexit(int i); extern int main(int argc, char *argv[]); extern VOID map(void); extern VOID sym(void); extern int parse(void); extern VOID doparse(void); extern VOID setarea(void); extern VOID setgbl(void); extern VOID usage(int n); extern VOID copyfile (FILE *dest, FILE *src); /* lklex.c */ extern VOID chopcrlf(char *str); extern char endline(void); extern int get(void); extern VOID getfid(char *str, int c); extern VOID getid(char *id, int c); extern VOID getSid(char *id); extern int getmap(int d); extern int getnb(void); extern int more(void); extern int nxtline(void); extern VOID skip(int c); extern VOID unget(int c); /* lkarea.c */ extern VOID lkparea(char *id); extern VOID lnkarea(void); extern VOID lnkarea2(void); extern VOID newarea(void); /* lkbank.c */ extern VOID chkbank(FILE *fp); extern VOID lkfclose(void); extern VOID lkfopen(void); extern VOID lkpbank(char * id); extern VOID newbank(void); extern VOID setbank(void); /* lkhead.c */ extern VOID module(void); extern VOID newhead(void); extern VOID newmode(void); /* lksym.c */ extern int hash(char *p, int cflag); extern struct sym * lkpsym(char *id, int f); extern char * new(unsigned int n); extern struct sym * newsym(void); extern char * strsto(char *str); extern VOID symdef(FILE *fp); extern int symeq(char *p1, char *p2, int cflag); extern VOID syminit(void); extern VOID symmod(FILE *fp, struct sym *tsp); extern a_uint symval(struct sym *tsp); /* lkeval.c */ extern int digit(int c, int r); extern a_uint eval(void); extern a_uint expr(int n); extern int oprio(int c); extern a_uint term(void); /* lklist.c */ extern int dgt(int rdx, char *str, int n); extern VOID newpag(FILE *fp); extern VOID slew(struct area *xp, struct bank *yp); extern VOID lstarea(struct area *xp, struct bank *yp); extern VOID lkulist(int i); extern VOID lkalist(a_uint cpc); extern VOID lkglist(a_uint cpc, int v, int err); /* lknoice.c */ extern VOID NoICEfopen(void); extern VOID NoICEmagic(void); extern VOID DefineNoICE(char *name, a_uint value, struct bank *yp); extern VOID DefineGlobal(char *name, a_uint value, struct bank *yp); extern VOID DefineScoped(char *name, a_uint value, struct bank *yp); extern VOID DefineFile(char *name, a_uint value, struct bank *yp); extern VOID DefineFunction(char *name, a_uint value, struct bank *yp); extern VOID DefineStaticFunction(char *name, a_uint value, struct bank *yp); extern VOID DefineEndFunction(a_uint value, struct bank *yp); extern VOID DefineLine(char *lineString, a_uint value, struct bank *yp); extern VOID PagedAddress(a_uint value, struct bank *yp); /* lksdcdb.c */ extern VOID SDCDBfopen(void); extern VOID SDCDBcopy(char * str); extern VOID DefineSDCDB(char *name, a_uint value); /* lkrloc.c */ extern a_uint adb_1b(a_uint v, int i); extern a_uint adb_2b(a_uint v, int i); extern a_uint adb_3b(a_uint v, int i); extern a_uint adb_4b(a_uint v, int i); extern a_uint adb_xb(a_uint v, int i); extern a_uint evword(void); extern VOID prntval(FILE *fptr, a_uint v); extern VOID reloc(int c); /* lkrloc3.c */ extern a_uint adb_bit(a_uint v, int i); extern a_uint adb_24_bit(a_uint v, int i); extern a_uint adb_24_hi(a_uint v, int i); extern a_uint adb_24_mid(a_uint v, int i); extern a_uint adb_24_lo(a_uint v, int i); extern a_uint adb_hi(a_uint v, int i); extern a_uint adb_lo(a_uint v, int i); extern char * errmsg3[]; extern VOID errdmp3(FILE *fptr, char *str); extern VOID erpdmp3(FILE *fptr, char *str); extern VOID rele3(void); extern VOID reloc3(int c); extern VOID relt3(void); extern VOID relr3(void); extern VOID relp3(void); extern VOID relerr3(char *str); extern VOID relerp3(char *str); extern int vpdkinst(int inst, int addr, int ver); /* lklibr.c */ extern int addfile(char *path, char *libfil); extern VOID addlib(void); extern VOID addpath(void); extern int fndsym(char *name); extern VOID library(void); extern VOID loadfile(char *filspc); extern VOID search(void); /* lkout.c */ extern VOID lkout(int i); extern VOID lkflush(void); extern VOID ixx(int i); extern VOID iflush(void); extern VOID dbx(int i); extern VOID dflush(void); /* lks19.c */ extern VOID s19(int i); extern VOID sflush(void); /* EEP: lkelf.c */ extern VOID elf(); /* JCF: lkmem.c */ extern int summary(struct area * xp); extern int summary2(struct area * xp); /* JCF: lkaomf51.c */ extern void SaveLinkedFilePath(char * filepath); extern void CreateAOMF51(void); /* lkgb.h */ VOID gb(int in); VOID gg(int in); /* strcmpi.h */ extern int as_strcmpi(const char *s1, const char *s2); extern int as_strncmpi(const char *s1, const char *s2, size_t n); #else #endif