diff options
author | Steve Chamberlain <sac@cygnus> | 1992-01-28 18:21:36 +0000 |
---|---|---|
committer | Steve Chamberlain <sac@cygnus> | 1992-01-28 18:21:36 +0000 |
commit | 870f54b2c887f03258f78baf5e772cb055c69b06 (patch) | |
tree | 22bef9ed29165e535059ab56d5b52a478784eda9 /ld/relax.c | |
parent | daa91756f11404bc87d38eb1e1a6bc9435e0326a (diff) | |
download | gdb-870f54b2c887f03258f78baf5e772cb055c69b06.zip gdb-870f54b2c887f03258f78baf5e772cb055c69b06.tar.gz gdb-870f54b2c887f03258f78baf5e772cb055c69b06.tar.bz2 |
* ldgram.y: map -M behave in the same way as -Map (sets file name
to be "-".
* ldsym.c, ldlang.c: remember that size of a section is dependent on
whether or not relaxing has been done.
* ldmain.c: don't open a map file if it doesn't have a name
* relax.c: all the brains have moved into bfd.
* ldwrite.c: ammend comment
Diffstat (limited to 'ld/relax.c')
-rw-r--r-- | ld/relax.c | 140 |
1 files changed, 1 insertions, 139 deletions
@@ -141,99 +141,6 @@ DEFUN(write_relaxnorel,(output_bfd), -static void -DEFUN(perform_slip,(s, slip, input_section, value), - asymbol **s AND - unsigned int slip AND - asection *input_section AND - bfd_vma value) -{ - - /* Find all symbols past this point, and make them know - what's happened */ - while (*s) - { - asymbol *p = *s; - if (p->section == input_section) - { - /* This was pointing into this section, so mangle it */ - if (p->value > value) - { - p->value -=2; - } - } - s++; - - } -} -static int -DEFUN(movb1,(input_section, symbols, r, shrink), - asection *input_section AND - asymbol **symbols AND - arelent *r AND - unsigned int shrink) -{ - - - bfd_vma value = get_value(r, input_section); - - if (value >= 0xff00) - { - - /* Change the reloc type from 16bit, possible 8 to 8bit - possible 16 */ - r->howto = r->howto + 1; - /* The place to relc moves back by one */ - r->address -=1; - - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - perform_slip(symbols, 2, input_section, r->address - shrink +1); - - - } - return shrink; -} - -static int -DEFUN(jmp1,(input_section, symbols, r, shrink), - asection *input_section AND - asymbol **symbols AND - arelent *r AND - unsigned int shrink) -{ - - - bfd_vma value = get_value(r, 0); - - bfd_vma dot = input_section->output_section->vma + - input_section->output_offset + r->address; - bfd_vma gap; - - /* See if the address we're looking at within 127 bytes of where - we are, if so then we can use a small branch rather than the - jump we were going to */ - - gap = value - (dot - shrink); - - - if (-120 < (long)gap && (long)gap < 120 ) - { - - /* Change the reloc type from 16bit, possible 8 to 8bit - possible 16 */ - r->howto = r->howto + 1; - /* The place to relc moves back by one */ - r->address -=1; - - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - perform_slip(symbols, 2, input_section, r->address-shrink +1); - - - } - return shrink; -} /* See if we can change the size of this section by shrinking the @@ -248,52 +155,7 @@ DEFUN(relax_section,(this_ptr), lang_input_section_type *is = &((*this_ptr)->input_section); asection *i = is->section; - - /* Get enough memory to hold the stuff */ - bfd *input_bfd = i->owner; - asection *input_section = i; - int shrink = 0 ; - int new = 0; - - bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd, - input_section); - arelent **reloc_vector = (arelent **)ldmalloc(reloc_size); - - /* Get the relocs and think about them */ - if (bfd_canonicalize_reloc(input_bfd, - input_section, - reloc_vector, - is->ifile->asymbols) ) - { - arelent **parent; - asymbol **symbols = is->ifile->asymbols; - for (parent = reloc_vector; *parent; parent++) - { - arelent *r = *parent; - switch (r->howto->type) { - case R_MOVB2: - case R_JMP2: - - shrink+=2; - break; - - case R_MOVB1: - shrink = movb1(input_section, symbols, r, shrink); - new = 1; - - break; - case R_JMP1: - shrink = jmp1(input_section, symbols, r, shrink); - new = 1; - - break; - } - } - - } - input_section->_cooked_size -= shrink; - free((char *)reloc_vector); - return new; + return bfd_relax_section(i->owner, i, is->ifile->asymbols); } |