qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 02/40] elf: Add notes implementation


From: Stefan Weil
Subject: Re: [Qemu-devel] [PATCH 02/40] elf: Add notes implementation
Date: Mon, 01 Nov 2010 22:31:56 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.15) Gecko/20101027 Thunderbird/3.0.10

Am 01.11.2010 22:17, schrieb Alexander Graf:

On 01.11.2010, at 16:19, Stefan Weil wrote:

Am 01.11.2010 20:51, schrieb Alexander Graf:
On 01.11.2010, at 14:42, Stefan Weil wrote:


Am 01.11.2010 19:29, schrieb Blue Swirl:

On Mon, Nov 1, 2010 at 3:01 PM, Alexander Graf<address@hidden> wrote:


---
hw/elf_ops.h | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
hw/loader.c | 7 ++++++
hw/loader.h | 3 ++
3 files changed, 70 insertions(+), 1 deletions(-)

diff --git a/hw/elf_ops.h b/hw/elf_ops.h
index 8b63dfc..645d058 100644
--- a/hw/elf_ops.h
+++ b/hw/elf_ops.h
@@ -189,6 +189,44 @@ static int glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd, int must_swab,
return -1;
}

+static void glue(elf_read_notes, SZ)(uint8_t *data, int data_len,
+ ElfHandlers *handlers, int must_swab)
+{
+ uint8_t *p = data;
+
+ while ((ulong)&p[3]< (ulong)&data[data_len]) {


Please use 'unsigned long'.


Why is a type cast used here? I see no reason for it.

Pointers can't be compared, you have to cast them to values first.


Alex


No. Pointers of same type which are not void pointers can be compared.

There is even a data type ptrdiff_t, so you can also compare their
difference with zero.

Let's ask someone who definitely knows :).

Michael, is code like

char *x = a, *y = b;
if (x < y) {
...
}

valid? Or do I first have to cast x and y to unsigned longs or uintptr_t?


Alex



Hopefully C did not change for code like this during the last
20 years.

Then your code is always valid, but will only return useful results
if both a and b are derived from the same base pointer
(plus an individual offset):

char *base = any_value;
a = base + offset_a;
b = base + offset_b;

Then
        x - y = a - b = (ptrdiff_t)(offset_a - offset_b) / (sizeof(*x);
and
        (x < y) == (a < b) == (offset_a < offset_b);

Regards,
Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]