diff options
-rw-r--r-- | ld/ChangeLog | 11 | ||||
-rw-r--r-- | ld/ldlex.l | 58 | ||||
-rw-r--r-- | ld/ldmisc.c | 269 |
3 files changed, 189 insertions, 149 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index e65f345..3774505 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +Thu Aug 13 11:49:34 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * ldlex.l: now parses comment correctly, added ~ to acceptable + chars in filenames + + * ldexp.c (exp_unop): pass down abs_output_section - now can have + unary -ve constants. + + * ldlang.c (lang_finish): warn when an entry symbol supplied on + the command line can't be found. + Fri Aug 7 12:31:10 1992 Steve Chamberlain (sac@thepub.cygnus.com) * ldlang.h: add new field "loadable" to output_section_statement. @@ -43,6 +43,37 @@ char *buystring(); unsigned int lineno = 1; int old; +comment() +{ + int c; + while (1) + { + c = input(); + while (c !='*' && c != EOF) + { + if (c == '\n') lineno++; + c = input(); + } + + + if (c == '*') + { + c = input(); + while ( c == '*') + c = input(); + if ( c == '/' ) + break; /* found the end */ + } + + if ( c == EOF ) + { + einfo( "%F%P :EOF in comment"); + break; + } + } +} + + #undef YY_INPUT #define YY_INPUT(buf,result,max_size) yy_input(buf, &result, max_size) #undef YY_FATAL_ERROR @@ -66,11 +97,11 @@ unsigned int include_stack_ptr = 0; %a 4000 %o 5000 -CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-] -CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>] -FILENAMECHAR1 [_a-zA-Z\/\.\\] +CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~] +CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~] +FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~] SYMBOLCHARN [_a-zA-Z\/\.\\0-9] -FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\] +FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~] FILENAME {FILENAMECHAR}+ WHITE [ \t\n]+ @@ -83,6 +114,10 @@ WHITE [ \t\n]+ %s MRI %% + +<BOTH,SCRIPT,EXPRESSION,COMMAND>"/*" { comment(); } + + <DEFSYMEXP>"-" { RTOKEN('-');} <DEFSYMEXP>"+" { RTOKEN('+');} <DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = buystring(yytext); return NAME; } @@ -300,7 +335,7 @@ WHITE [ \t\n]+ <MRI>"FORMAT" { RTOKEN(FORMAT); } <MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } <MRI>"SECT" { RTOKEN(SECT); } -<MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); } +<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); } <MRI>"end" { RTOKEN(ENDWORD); } <MRI>"chip" { RTOKEN(CHIP); } <MRI>"load" { RTOKEN(LOAD); } @@ -309,7 +344,7 @@ WHITE [ \t\n]+ <MRI>"format" { RTOKEN(FORMAT); } <MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ } <MRI>"sect" { RTOKEN(SECT); } -<MRI>"absolute" { RTOKEN(ABSOLUTE); } +<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); } <COMMAND>{CMDFILENAMECHAR1}{CMDFILENAMECHAR}* { yylval.name = buystring(yytext); @@ -335,16 +370,6 @@ WHITE [ \t\n]+ <BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;} <MRI,COMMAND,BOTH,SCRIPT,EXPRESSION>[ \t] -"/*" { old = INITIAL; BEGIN(COMMENT); } -<COMMAND>"/*" { old = COMMAND; BEGIN(COMMENT); } -<BOTH>"/*" { old =BOTH; BEGIN(COMMENT); } -<SCRIPT>"/*" { old = EXPRESSION; BEGIN(COMMENT); } -<EXPRESSION>"/*" { old = SCRIPT; BEGIN(COMMENT); } -"/*" { old = INITIAL; BEGIN(COMMENT); } -<COMMENT>[^*\\n]* -<COMMENT>"*"+[^*/\\n]* -<COMMENT>\\n { ++lineno;} -<COMMENT>"*"+"/" { BEGIN(old); } <<EOF>> { include_stack_ptr--; @@ -501,3 +526,4 @@ int max_size; YY_FATAL_ERROR( "read() in flex scanner failed" ); } } + diff --git a/ld/ldmisc.c b/ld/ldmisc.c index 87a91c9..9a70af9 100644 --- a/ld/ldmisc.c +++ b/ld/ldmisc.c @@ -19,12 +19,6 @@ You should have received a copy of the GNU General Public License along with GLD; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* -$Id$ - - - */ - #include "bfd.h" #include "sysdep.h" #include <varargs.h> @@ -41,12 +35,6 @@ extern FILE *ldlex_input_stack; extern char *ldfile_input_filename; extern ld_config_type config; -void -yyerror(arg) -char *arg; -{ - einfo("%P%F: %S %s\n",arg); -} extern int errno; extern int sys_nerr; @@ -86,67 +74,67 @@ vfinfo(fp, fmt, arg) fmt ++; switch (*fmt++) { - case 'X': + case 'X': config.make_executable = false; break; - case 'V': - { - bfd_vma value = va_arg(arg, bfd_vma); - fprintf_vma(fp, value); - } + case 'V': + { + bfd_vma value = va_arg(arg, bfd_vma); + fprintf_vma(fp, value); + } break; - case 'T': - { - asymbol *symbol = va_arg(arg, asymbol *); - if (symbol) - { + case 'T': + { + asymbol *symbol = va_arg(arg, asymbol *); + if (symbol) + { - asection *section = symbol->section; - char *cplusname = cplus_demangle(symbol->name, 1); - CONST char *section_name = section->name; - if (section != &bfd_und_section) - { - fprintf(fp,"%s (%s)", cplusname ? cplusname : - symbol->name, section_name); - } - else - { - fprintf(fp,"%s", cplusname ? cplusname : symbol->name); - } + asection *section = symbol->section; + char *cplusname = cplus_demangle(symbol->name, 1); + CONST char *section_name = section->name; + if (section != &bfd_und_section) + { + fprintf(fp,"%s (%s)", cplusname ? cplusname : + symbol->name, section_name); + } + else + { + fprintf(fp,"%s", cplusname ? cplusname : symbol->name); + } - if (cplusname) - { - free(cplusname); - } + if (cplusname) + { + free(cplusname); + } - } - else - { - fprintf(fp,"no symbol"); - } - } + } + else + { + fprintf(fp,"no symbol"); + } + } break; - case 'B': - { - bfd *abfd = va_arg(arg, bfd *); - if (abfd->my_archive) { - fprintf(fp,"%s(%s)", abfd->my_archive->filename, - abfd->filename); - } - else { - fprintf(fp,"%s", abfd->filename); - - } - } + case 'B': + { + bfd *abfd = va_arg(arg, bfd *); + if (abfd->my_archive) { + fprintf(fp,"%s(%s)", abfd->my_archive->filename, + abfd->filename); + } + else { + fprintf(fp,"%s", abfd->filename); + + } + } break; - case 'F': + case 'F': fatal = true; break; - case 'P': + case 'P': fprintf(fp,"%s", program_name); break; - case 'E': + case 'E': /* Replace with the most recent errno explanation */ @@ -154,115 +142,124 @@ vfinfo(fp, fmt, arg) break; - case 'I': - { - lang_input_statement_type *i = - va_arg(arg,lang_input_statement_type *); + case 'I': + { + lang_input_statement_type *i = + va_arg(arg,lang_input_statement_type *); - fprintf(fp,"%s", i->local_sym_name); - } + fprintf(fp,"%s", i->local_sym_name); + } break; - case 'S': + case 'S': /* Print source script file and line number */ - { + { - extern unsigned int lineno; - if (ldfile_input_filename == (char *)NULL) { - fprintf(fp,"command line"); - } - else { - fprintf(fp,"%s:%u", ldfile_input_filename, lineno ); - } - } + extern unsigned int lineno; + if (ldfile_input_filename == (char *)NULL) { + fprintf(fp,"command line"); + } + else { + fprintf(fp,"%s:%u", ldfile_input_filename, lineno ); + } + } break; - case 'R': + case 'R': /* Print all that's interesting about a relent */ - { - arelent *relent = va_arg(arg, arelent *); + { + arelent *relent = va_arg(arg, arelent *); - fprintf(fp,"%s+0x%x (type %s)", - (*(relent->sym_ptr_ptr))->name, - relent->addend, - relent->howto->name); + fprintf(fp,"%s+0x%x (type %s)", + (*(relent->sym_ptr_ptr))->name, + relent->addend, + relent->howto->name); - } + } break; - case 'C': - { - CONST char *filename; - CONST char *functionname; - char *cplus_name; + case 'C': + { + CONST char *filename; + CONST char *functionname; + char *cplus_name; - unsigned int linenumber; - bfd *abfd = va_arg(arg, bfd *); - asection *section = va_arg(arg, asection *); - asymbol **symbols = va_arg(arg, asymbol **); - bfd_vma offset = va_arg(arg, bfd_vma); + unsigned int linenumber; + bfd *abfd = va_arg(arg, bfd *); + asection *section = va_arg(arg, asection *); + asymbol **symbols = va_arg(arg, asymbol **); + bfd_vma offset = va_arg(arg, bfd_vma); - if (bfd_find_nearest_line(abfd, - section, - symbols, - offset, - &filename, - &functionname, - &linenumber)) - { - if (filename == (char *)NULL) - filename = abfd->filename; - if (functionname != (char *)NULL) - { - cplus_name = cplus_demangle(functionname, 1); - fprintf(fp,"%s:%u: (%s)", filename, linenumber, - cplus_name? cplus_name: functionname); - if (cplus_name) - free(cplus_name); + if (bfd_find_nearest_line(abfd, + section, + symbols, + offset, + &filename, + &functionname, + &linenumber)) + { + if (filename == (char *)NULL) + filename = abfd->filename; + if (functionname != (char *)NULL) + { + cplus_name = cplus_demangle(functionname, 1); + fprintf(fp,"%s:%u: (%s)", filename, linenumber, + cplus_name? cplus_name: functionname); + if (cplus_name) + free(cplus_name); - } + } - else if (linenumber != 0) - fprintf(fp,"%s:%u", filename, linenumber); - else - fprintf(fp,"%s(%s+%0x)", filename, - section->name, - offset); - - } - else { - fprintf(fp,"%s(%s+%0x)", abfd->filename, + else if (linenumber != 0) + fprintf(fp,"%s:%u", filename, linenumber); + else + fprintf(fp,"%s(%s+%0x)", filename, section->name, offset); - } - } + + } + else { + fprintf(fp,"%s(%s+%0x)", abfd->filename, + section->name, + offset); + } + } break; - case 's': + case 's': fprintf(fp,"%s", va_arg(arg, char *)); break; - case 'd': + case 'd': fprintf(fp,"%d", va_arg(arg, int)); break; - default: + default: fprintf(fp,"%s", va_arg(arg, char *)); break; } } } - if (fatal == true) { - extern char *output_filename; - if (output_filename) - unlink(output_filename); - exit(1); + if (fatal == true) + { + extern char *output_filename; + if (output_filename) + { + char *new = malloc(strlen(output_filename)+2); + extern bfd *output_bfd; + + strcpy(new, output_filename); + if (output_bfd && output_bfd->iostream) + fclose((FILE *)(output_bfd->iostream)); + unlink(new); } + exit(1); + } } /* Format info message and print on stdout. */ @@ -325,7 +322,6 @@ DEFUN(concat, (s1, s2, s3), } - PTR DEFUN(ldmalloc, (size), bfd_size_type size) @@ -338,6 +334,13 @@ bfd_size_type size) return result; } +PTR +DEFUN(xmalloc,(size), +int size) +{ +return ldmalloc(size); +} + PTR DEFUN(ldrealloc, (ptr, size), |