public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Reinhard Meyer <u-boot@emk-elektronik.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC] [PATCH V2] arm: arm926ejs: use ELF relocations
Date: Tue, 05 Oct 2010 12:36:19 +0200	[thread overview]
Message-ID: <4CAAFFA3.6060602@emk-elektronik.de> (raw)
In-Reply-To: <4CAAF9D6.6040803@free.fr>

Albert ARIBAUD schrieb:
> Le 05/10/2010 11:39, Reinhard Meyer a ?crit :
>>> for (p = start; p<  end; p += 8)
>>>     work;
>>> and not
>>
>> Give me some time, and I will complete this loop to do
>> relocation in "C".

Almost finished with it :)

>> Reinhard
> 
> Be careful, though, that you need a way to obtain the 'source' address
> of the .rel.dyn start and end and of the .dynsym start, plus the offset
> from 'source' to 'target'; these may not be easy to compute in C

No problem, the statements

.globl _rel_dyn_start_ofs
_rel_dyn_start_ofs:
	.word __rel_dyn_start - _start
.globl _rel_dyn_end_ofs
_rel_dyn_end_ofs:
	.word __rel_dyn_end - _start
.globl _dynsym_start_ofs
_dynsym_start_ofs:
	.word __dynsym_start - _start

get the values to "C".

> 
> I think the right balance might be to have an ASM framework to prepare
> these four values and pass them to the C relocation routine.

see above.

> 
> Note that you may also have to make sure the routine itself is
> insensitive to relocation too.

Why? It runs while code is at the right TEXT_BASE. If that shall
be weakened, I am not sure it can be done in "C".

I am troubled by your following statements in assembly:


Note: my u-boot has only one type "2" relocation:
patch 21f151fc : 00000302

fixabs:
	/* absolute fix: set location to (offset) symbol value */
r1=00000302
	mov	r1, r1, LSR #4		/* r1 <- symbol index in .dynsym */
r1=00000030
	add	r1, r10, r1		/* r1 <- address of symbol in table */
r1=00000030+_dynsym_start_ofs
	ldr	r1, [r1, #4]		/* r1 <- symbol value */
r1=r1[4]
	add	r1, r9			/* r1 <- relocated sym addr */
	b	fixnext

Is an entry in _dynsym really 16 bytes long?

Best Regards,
Reinhard

PS: I am about there:

#ifdef CONFIG_USE_C_RELOCATION
	/* TODO: check for identical source and destination */
	/* TODO: check for overlapping */
	/* copy image, including initialized data */
	debug ("memcpy(%08lx,%08lx,%ld)\n",
		addr, _TEXT_BASE, _bss_start_ofs);
	memcpy (addr, _TEXT_BASE, _bss_start_ofs);
	/* now fix the code */
	debug ("_dynsym_start_ofs=%08lx _rel_dyn_start_ofs=%08lx _rel_dyn_end_ofs=%08lx\n",
		_dynsym_start_ofs, _rel_dyn_start_ofs, _rel_dyn_end_ofs);
	for (dyn_ptr = (ulong *)(_TEXT_BASE + _rel_dyn_start_ofs);
			dyn_ptr < (ulong *)(_TEXT_BASE + _rel_dyn_end_ofs);
			dyn_ptr += 8) {
		ulong *patchaddr = (ulong *) dyn_ptr[0] + addr;
		debug ("patch %08lx : %08lx\n",
			patchaddr, dyn_ptr[1]);
		switch (dyn_ptr[1] & 0xff) {
		case 23: /* rel fixup */
			*patchaddr += addr;
			break;
		case 2: /* abs fixup */
			break;
		default: /* unhandled fixup */
			break;
		}
	}

Beautifying comes later ;)

  reply	other threads:[~2010-10-05 10:36 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-05  6:31 [U-Boot] [RFC] [PATCH V2] arm: arm926ejs: use ELF relocations Albert Aribaud
2010-10-05  6:45 ` Wolfgang Denk
2010-10-05  7:05   ` Reinhard Meyer
2010-10-05  7:23     ` Reinhard Meyer
2010-10-05  7:52       ` Reinhard Meyer
2010-10-05  8:33         ` Heiko Schocher
2010-10-05  8:41           ` Albert ARIBAUD
2010-10-05  9:00             ` Heiko Schocher
2010-10-05  9:10               ` Reinhard Meyer
2010-10-05  9:15                 ` Heiko Schocher
2010-10-05  9:19                   ` Reinhard Meyer
2010-10-05  9:29                     ` Heiko Schocher
2010-10-05  9:33                       ` Reinhard Meyer
2010-10-05  9:39                         ` Reinhard Meyer
2010-10-05 10:11                           ` Albert ARIBAUD
2010-10-05 10:36                             ` Reinhard Meyer [this message]
2010-10-05 10:49                               ` Graeme Russ
2010-10-05 11:01                                 ` Reinhard Meyer
2010-10-05 11:18                                   ` Albert ARIBAUD
2010-10-05 10:33                         ` Albert ARIBAUD
2010-10-05 10:40                           ` Wolfgang Denk
2010-10-05 11:10                             ` Albert ARIBAUD
2010-10-05 11:17                               ` Reinhard Meyer
2010-10-05 11:46                                 ` Albert ARIBAUD
2010-10-05 13:18                                   ` Reinhard Meyer
2010-10-05 13:24                                     ` Graeme Russ
2010-10-05 13:36                                     ` Albert ARIBAUD
2010-10-05 14:06                                       ` Reinhard Meyer
2010-10-05 11:43                               ` Wolfgang Denk
2010-10-05 10:20         ` Albert ARIBAUD
2010-10-05  8:27     ` Wolfgang Denk
2010-10-05  8:38       ` Reinhard Meyer
2010-10-05  8:50         ` Albert ARIBAUD
2010-10-05  8:59           ` Reinhard Meyer
2010-10-05  7:07   ` Wolfgang Denk
2010-10-05  7:40 ` Heiko Schocher
2010-10-05  8:32   ` Albert ARIBAUD
2010-10-05  8:02 ` Wolfgang Denk
2010-10-05  9:25 ` Heiko Schocher
2010-10-05  9:32   ` Albert ARIBAUD
2010-10-05 12:07   ` Heiko Schocher
2010-10-05 12:52 ` Heiko Schocher

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CAAFFA3.6060602@emk-elektronik.de \
    --to=u-boot@emk-elektronik.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox