From 4e778d73e61885bf25e754635bf9c0fe67c5d9ba Mon Sep 17 00:00:00 2001 From: bg- Date: Mon, 4 Jun 2007 17:50:25 +0000 Subject: [PATCH] * Add cle_info argument to cle_write_reloc. * Use cle_info to extract low order bits in pc-relative calculation. --- core/loader/cle_avr.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/loader/cle_avr.c b/core/loader/cle_avr.c index 88626968b..43aea3a82 100644 --- a/core/loader/cle_avr.c +++ b/core/loader/cle_avr.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)$Id: cle_avr.c,v 1.2 2007/05/11 15:40:16 bg- Exp $ + * @(#)$Id: cle_avr.c,v 1.3 2007/06/04 17:50:25 bg- Exp $ */ /* @@ -74,10 +74,12 @@ * specific! */ int -cle_write_reloc(unsigned char *pos, +cle_write_reloc(void *pos_, const struct elf32_rela *rela, - cle_addr addr) + cle_addr addr, + const struct cle_info *info) { + unsigned char *pos = pos_; unsigned char byte; switch(ELF32_R_TYPE(rela->r_info)) { @@ -88,7 +90,7 @@ cle_write_reloc(unsigned char *pos, case R_AVR_7_PCREL: /* 2 */ /* Reloc in bits 0x03f8 (0000 00kk kkkk k000). */ - byte = addr - rela->r_offset - 2; + byte = addr - (/* text */ + rela->r_offset + 2); byte = byte >> 1; pos[0] = (pos[0] & 0x07) | (byte << 3); /* 0xf8 */ pos[1] = (pos[1] & 0xfc) | (byte >> 5); /* 0x03 */ @@ -96,7 +98,7 @@ cle_write_reloc(unsigned char *pos, case R_AVR_13_PCREL: /* 3 */ /* Reloc in bits 0x0fff (0000 kkkk kkkk kkkk). */ - addr = addr - rela->r_offset - 2; + addr = addr - (info->text + rela->r_offset + 2); addr = addr >> 1; pos[0] = addr; pos[1] = (pos[1] & 0xf0) | ((addr >> 8) & 0x0f);