* [patch] Set bfd field in target_section
@ 2009-07-28 14:46 Aleksandar Ristovski
2009-07-28 14:51 ` Pedro Alves
0 siblings, 1 reply; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-07-28 14:46 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 498 bytes --]
Hello,
I believe this is related to Pedro's patch from 03-Jun-09. I
didn't see where we set target_section.bfd field - maybe I
am overlooking something, but in bfd-target, in function
target_bfd_xclose we will call bfd_close
(table->sections->bfd); bfd_close doesn't like NULL argument.
Am I missing something, or is this (the patch) missing?
Patch attached.
Thanks,
--
Aleksandar Ristovski
QNX Software Systems
ChangeLog:
* exec.c (build_section_table): Setup section_table bfd field.
[-- Attachment #2: exec_c-20090728.diff --]
[-- Type: text/x-patch, Size: 641 bytes --]
Index: gdb/exec.c
===================================================================
RCS file: /cvs/src/src/gdb/exec.c,v
retrieving revision 1.90
diff -u -p -r1.90 exec.c
--- gdb/exec.c 2 Jul 2009 17:21:06 -0000 1.90
+++ gdb/exec.c 28 Jul 2009 14:21:09 -0000
@@ -441,6 +441,7 @@ build_section_table (struct bfd *some_bf
bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
if (*end > *start + count)
internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
+ (*start)->bfd = (*end)->bfd = some_bfd;
/* We could realloc the table, but it probably loses for most files. */
return 0;
}
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 14:46 [patch] Set bfd field in target_section Aleksandar Ristovski
@ 2009-07-28 14:51 ` Pedro Alves
2009-07-28 14:59 ` Pedro Alves
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Pedro Alves @ 2009-07-28 14:51 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski, gdb-patches
On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote:
> Hello,
>
> I believe this is related to Pedro's patch from 03-Jun-09. I
> didn't see where we set target_section.bfd field - maybe I
> am overlooking something, but in bfd-target, in function
> target_bfd_xclose we will call bfd_close
> (table->sections->bfd); bfd_close doesn't like NULL argument.
>
> Am I missing something, or is this (the patch) missing?
Doesn't add_to_section_table set the bfd in each new
target section?
>
> Patch attached.
>
> Thanks,
>
> --
> Aleksandar Ristovski
> QNX Software Systems
>
> ChangeLog:
>
> * exec.c (build_section_table): Setup section_table bfd field.
> exec_c-20090728.diff
> Index: gdb/exec.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/exec.c,v
> retrieving revision 1.90
> diff -u -p -r1.90 exec.c
> --- gdb/exec.c 2 Jul 2009 17:21:06 -0000 1.90
> +++ gdb/exec.c 28 Jul 2009 14:21:09 -0000
> @@ -441,6 +441,7 @@ build_section_table (struct bfd *some_bf
> bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
> if (*end > *start + count)
> internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
> + (*start)->bfd = (*end)->bfd = some_bfd;
> /* We could realloc the table, but it probably loses for most files. */
> return 0;
> }
--
Pedro Alves
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 14:51 ` Pedro Alves
@ 2009-07-28 14:59 ` Pedro Alves
2009-07-28 15:06 ` Aleksandar Ristovski
2009-07-28 15:16 ` Pedro Alves
2 siblings, 0 replies; 11+ messages in thread
From: Pedro Alves @ 2009-07-28 14:59 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski, gdb-patches
On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote:
> Hello,
>
> I believe this is related to Pedro's patch from 03-Jun-09. I
> didn't see where we set target_section.bfd field - maybe I
> am overlooking something, but in bfd-target, in function
> target_bfd_xclose we will call bfd_close
> (table->sections->bfd); bfd_close doesn't like NULL argument.
>
> Am I missing something, or is this (the patch) missing?
Doesn't add_to_section_table set the bfd in each new
target section?
>
> Patch attached.
>
> Thanks,
>
> --
> Aleksandar Ristovski
> QNX Software Systems
>
> ChangeLog:
>
> * exec.c (build_section_table): Setup section_table bfd field.
> exec_c-20090728.diff
> Index: gdb/exec.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/exec.c,v
> retrieving revision 1.90
> diff -u -p -r1.90 exec.c
> --- gdb/exec.c 2 Jul 2009 17:21:06 -0000 1.90
> +++ gdb/exec.c 28 Jul 2009 14:21:09 -0000
> @@ -441,6 +441,7 @@ build_section_table (struct bfd *some_bf
> bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end);
> if (*end > *start + count)
> internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
> + (*start)->bfd = (*end)->bfd = some_bfd;
> /* We could realloc the table, but it probably loses for most files. */
> return 0;
> }
--
Pedro Alves
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 14:51 ` Pedro Alves
2009-07-28 14:59 ` Pedro Alves
@ 2009-07-28 15:06 ` Aleksandar Ristovski
2009-07-28 16:22 ` Pedro Alves
2009-07-28 15:16 ` Pedro Alves
2 siblings, 1 reply; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-07-28 15:06 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
Pedro Alves wrote:
> On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote:
>> Hello,
>>
>> I believe this is related to Pedro's patch from 03-Jun-09. I
>> didn't see where we set target_section.bfd field - maybe I
>> am overlooking something, but in bfd-target, in function
>> target_bfd_xclose we will call bfd_close
>> (table->sections->bfd); bfd_close doesn't like NULL argument.
>>
>> Am I missing something, or is this (the patch) missing?
>
> Doesn't add_to_section_table set the bfd in each new
> target section?
Indeed it does. However, the problem is if we don't find any
sections in a bfd, it will exit and will leave bfd field 0.
I get this situation at the moment because I broke my
xfer_partial, but I think it could happen in general?
---
Aleksandar
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 14:51 ` Pedro Alves
2009-07-28 14:59 ` Pedro Alves
2009-07-28 15:06 ` Aleksandar Ristovski
@ 2009-07-28 15:16 ` Pedro Alves
2009-07-28 15:57 ` Aleksandar Ristovski
2 siblings, 1 reply; 11+ messages in thread
From: Pedro Alves @ 2009-07-28 15:16 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski
On Tuesday 28 July 2009 15:34:41, Pedro Alves wrote:
> On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote:
> > Hello,
> >
> > I believe this is related to Pedro's patch from 03-Jun-09. I
> > didn't see where we set target_section.bfd field - maybe I
> > am overlooking something, but in bfd-target, in function
> > target_bfd_xclose we will call bfd_close
> > (table->sections->bfd); bfd_close doesn't like NULL argument.
> >
> > Am I missing something, or is this (the patch) missing?
>
> Doesn't add_to_section_table set the bfd in each new
> target section?
I think you've got yourself an executable without any ALLOC
section, hence the section table ends up empty. I think something
like this will fix the problem. I'll give a test spin and
apply it.
--
Pedro Alves
---
gdb/bfd-target.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
Index: src/gdb/bfd-target.c
===================================================================
--- src.orig/gdb/bfd-target.c 2009-07-28 15:43:27.000000000 +0100
+++ src/gdb/bfd-target.c 2009-07-28 15:47:33.000000000 +0100
@@ -54,7 +54,10 @@ static void
target_bfd_xclose (struct target_ops *t, int quitting)
{
struct target_section_table *table = t->to_data;
- if (table->sections)
+
+ /* If the target sections table is empty, the bfd had already been
+ closed. */
+ if (table->sections != table->sections_end)
bfd_close (table->sections->bfd);
xfree (table->sections);
xfree (table);
@@ -70,6 +73,12 @@ target_bfd_reopen (struct bfd *bfd)
table = XZALLOC (struct target_section_table);
build_section_table (bfd, &table->sections, &table->sections_end);
+ /* No use keeping the bfd open if there are no target sections we
+ care about. This way, we avoid keeping the bfd pointer stored
+ somewhere so that target_bfd_xclose could use it. */
+ if (table->sections == table->sections_end)
+ bfd_close (bfd);
+
t = XZALLOC (struct target_ops);
t->to_shortname = "bfd";
t->to_longname = _("BFD backed target");
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 15:16 ` Pedro Alves
@ 2009-07-28 15:57 ` Aleksandar Ristovski
0 siblings, 0 replies; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-07-28 15:57 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
Pedro Alves wrote:
> On Tuesday 28 July 2009 15:34:41, Pedro Alves wrote:
>> On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote:
>>> Hello,
>>>
>>> I believe this is related to Pedro's patch from 03-Jun-09. I
>>> didn't see where we set target_section.bfd field - maybe I
>>> am overlooking something, but in bfd-target, in function
>>> target_bfd_xclose we will call bfd_close
>>> (table->sections->bfd); bfd_close doesn't like NULL argument.
>>>
>>> Am I missing something, or is this (the patch) missing?
>> Doesn't add_to_section_table set the bfd in each new
>> target section?
>
> I think you've got yourself an executable without any ALLOC
> section, hence the section table ends up empty. I think something
> like this will fix the problem. I'll give a test spin and
> apply it.
>
Actually, I got it by mismatching libraries.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 15:06 ` Aleksandar Ristovski
@ 2009-07-28 16:22 ` Pedro Alves
2009-07-28 16:37 ` Aleksandar Ristovski
0 siblings, 1 reply; 11+ messages in thread
From: Pedro Alves @ 2009-07-28 16:22 UTC (permalink / raw)
To: Aleksandar Ristovski; +Cc: gdb-patches
On Tuesday 28 July 2009 15:45:25, Aleksandar Ristovski wrote:
> Pedro Alves wrote:
> > On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote:
> >> Hello,
> >>
> >> I believe this is related to Pedro's patch from 03-Jun-09. I
> >> didn't see where we set target_section.bfd field - maybe I
> >> am overlooking something, but in bfd-target, in function
> >> target_bfd_xclose we will call bfd_close
> >> (table->sections->bfd); bfd_close doesn't like NULL argument.
> >>
> >> Am I missing something, or is this (the patch) missing?
> >
> > Doesn't add_to_section_table set the bfd in each new
> > target section?
>
> Indeed it does. However, the problem is if we don't find any
> sections in a bfd, it will exit and will leave bfd field 0.
Right, but table->sections will be equal to table->sections_end,
meaning the table is empty. Your fix isn't correct, since you
should never write to *sections_end, which is one-past-the-end
of the sections in the table. In the degenerate case of
bfd_count_sections == 0 (not 0 ALLOC sections), xmalloc will
still return something non-NULL, but, writing to this pointer
invokes undefined behaviour.
> I get this situation at the moment because I broke my
> xfer_partial, but I think it could happen in general?
Testing finished succesfully, so I've applied the patch
with this ChangeLog entry. Let me know if something is still wrong.
2009-07-28 Pedro Alves <pedro@codesourcery.com>
* bfd-target.c (target_bfd_xclose): Only close the bfd if the
section table is not empty.
(target_bfd_reopen): If the section table ends up empty, close the
bfd here.
--
Pedro Alves
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 16:37 ` Aleksandar Ristovski
@ 2009-07-28 16:37 ` Pedro Alves
2009-07-28 21:48 ` Aleksandar Ristovski
0 siblings, 1 reply; 11+ messages in thread
From: Pedro Alves @ 2009-07-28 16:37 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski
On Tuesday 28 July 2009 16:16:23, Aleksandar Ristovski wrote:
> Pedro Alves wrote:
> I think now you broke it in a different way. Now we can end
> up trying to read from a closed bfd.
Ooops, you're right. There are uses of the bfd after transfering
its ownership to the bfd target with target_bfd_reopen, and closing
the bfd target (target_close)... This target is modeled on fdopen,
which is why I blindly assumed it wasn't happening. I've reverted
that patch.
> And just wondering, why not simply:
>
> Index: gdb/exec.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/exec.c,v
> retrieving revision 1.90
> diff -u -p -r1.90 exec.c
> --- gdb/exec.c 2 Jul 2009 17:21:06 -0000 1.90
> +++ gdb/exec.c 28 Jul 2009 14:58:16 -0000
> @@ -381,6 +381,7 @@ add_to_section_table (bfd *abfd, struct
> struct target_section **table_pp = (struct
> target_section **) table_pp_char;
> flagword aflag;
>
> + (*table_pp)->bfd = abfd;
> /* Check the section flags, but do not discard
> zero-length sections, since
> some symbols may still be attached to this section.
> For instance, we
> encountered on sparc-solaris 2.10 a shared library
> with an empty .bss
> @@ -390,7 +391,6 @@ add_to_section_table (bfd *abfd, struct
> if (!(aflag & SEC_ALLOC))
> return;
>
> - (*table_pp)->bfd = abfd;
> (*table_pp)->the_bfd_section = asect;
> (*table_pp)->addr = bfd_section_vma (abfd, asect);
> (*table_pp)->endaddr = (*table_pp)->addr +
> bfd_section_size (abfd, asect);
Still not right, because that's still papering over the problem, and
still hitting undefined behaviour, in the case of the
table ending up being empty. When table->sections == table->sections_end,
we should never dereference table->sections, like in 'table->sections->bfd'.
Notice how the end pointer isn't advanced if !SEC_ALLOC.
Consider the fact that we usually xmalloc enough memory that
makes that not misbehave a coincidence. E.g., see that with
a resize_section_table call, you can end up with table->sections == NULL,
and table->section_end == NULL, which is legal, because table->sections
is still equal to table->sections_end in that case (meaning empty table).
There used to be an extra structure in bfd_target.c to hold
the sections and the bfd, which didn't look necessary when I
reimplemented bfd-target.c on top of exec.c's functions, but
it is clear now that we need it anyway. Here's a patch that
brings something like that back.
Could you try it? Thanks.
--
Pedro Alves
2009-07-28 Pedro Alves <pedro@codesourcery.com>
* bfd-target.c (struct target_bfd_data): New.
(target_bfd_xfer_partial): Adjust to get at the section table from
the new structure.
(target_bfd_get_section_table): Ditto.
(target_bfd_xclose): Ditto. Get the bfd pointer from the
target_bfd_data structure, from the section table.
(target_bfd_reopen): Store a struct target_bfd_data in the
target_ops to_data field, instead of a target_section_table.
---
gdb/bfd-target.c | 41 ++++++++++++++++++++++++++++-------------
1 file changed, 28 insertions(+), 13 deletions(-)
Index: src/gdb/bfd-target.c
===================================================================
--- src.orig/gdb/bfd-target.c 2009-07-28 16:20:59.000000000 +0100
+++ src/gdb/bfd-target.c 2009-07-28 16:48:12.000000000 +0100
@@ -22,6 +22,19 @@
#include "bfd-target.h"
#include "exec.h"
+/* The object that is stored in the target_ops->to_data field has this
+ type. */
+struct target_bfd_data
+{
+ /* The BFD we're wrapping. */
+ struct bfd *bfd;
+
+ /* The section table build from the ALLOC sections in BFD. Note
+ that we rely on extracting the BFD from a random section in the
+ table, since the table can be legitimately empty. */
+ struct target_section_table table;
+};
+
static LONGEST
target_bfd_xfer_partial (struct target_ops *ops,
enum target_object object,
@@ -33,10 +46,10 @@ target_bfd_xfer_partial (struct target_o
{
case TARGET_OBJECT_MEMORY:
{
- struct target_section_table *table = ops->to_data;
+ struct target_bfd_data *data = ops->to_data;
return section_table_xfer_memory_partial (readbuf, writebuf, offset, len,
- table->sections,
- table->sections_end,
+ data->table.sections,
+ data->table.sections_end,
NULL);
}
default:
@@ -47,17 +60,18 @@ target_bfd_xfer_partial (struct target_o
static struct target_section_table *
target_bfd_get_section_table (struct target_ops *ops)
{
- return ops->to_data;
+ struct target_bfd_data *data = ops->to_data;
+ return &data->table;
}
static void
target_bfd_xclose (struct target_ops *t, int quitting)
{
- struct target_section_table *table = t->to_data;
- if (table->sections)
- bfd_close (table->sections->bfd);
- xfree (table->sections);
- xfree (table);
+ struct target_bfd_data *data = t->to_data;
+
+ bfd_close (data->bfd);
+ xfree (data->table.sections);
+ xfree (data);
xfree (t);
}
@@ -65,10 +79,11 @@ struct target_ops *
target_bfd_reopen (struct bfd *bfd)
{
struct target_ops *t;
- struct target_section_table *table;
+ struct target_bfd_data *data;
- table = XZALLOC (struct target_section_table);
- build_section_table (bfd, &table->sections, &table->sections_end);
+ data = XZALLOC (struct target_bfd_data);
+ data->bfd = bfd;
+ build_section_table (bfd, &data->table.sections, &data->table.sections_end);
t = XZALLOC (struct target_ops);
t->to_shortname = "bfd";
@@ -77,7 +92,7 @@ target_bfd_reopen (struct bfd *bfd)
t->to_get_section_table = target_bfd_get_section_table;
t->to_xfer_partial = target_bfd_xfer_partial;
t->to_xclose = target_bfd_xclose;
- t->to_data = table;
+ t->to_data = data;
return t;
}
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 16:22 ` Pedro Alves
@ 2009-07-28 16:37 ` Aleksandar Ristovski
2009-07-28 16:37 ` Pedro Alves
0 siblings, 1 reply; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-07-28 16:37 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
Pedro Alves wrote:
> On Tuesday 28 July 2009 15:45:25, Aleksandar Ristovski wrote:
>> Pedro Alves wrote:
>>> On Tuesday 28 July 2009 15:28:33, Aleksandar Ristovski wrote:
>>>> Hello,
>>>>
>>>> I believe this is related to Pedro's patch from 03-Jun-09. I
>>>> didn't see where we set target_section.bfd field - maybe I
>>>> am overlooking something, but in bfd-target, in function
>>>> target_bfd_xclose we will call bfd_close
>>>> (table->sections->bfd); bfd_close doesn't like NULL argument.
>>>>
>>>> Am I missing something, or is this (the patch) missing?
>>> Doesn't add_to_section_table set the bfd in each new
>>> target section?
>> Indeed it does. However, the problem is if we don't find any
>> sections in a bfd, it will exit and will leave bfd field 0.
>
> Right, but table->sections will be equal to table->sections_end,
> meaning the table is empty. Your fix isn't correct, since you
> should never write to *sections_end, which is one-past-the-end
> of the sections in the table. In the degenerate case of
> bfd_count_sections == 0 (not 0 ALLOC sections), xmalloc will
> still return something non-NULL, but, writing to this pointer
> invokes undefined behaviour.
>
>> I get this situation at the moment because I broke my
>> xfer_partial, but I think it could happen in general?
>
> Testing finished succesfully, so I've applied the patch
> with this ChangeLog entry. Let me know if something is still wrong.
>
> 2009-07-28 Pedro Alves <pedro@codesourcery.com>
>
> * bfd-target.c (target_bfd_xclose): Only close the bfd if the
> section table is not empty.
> (target_bfd_reopen): If the section table ends up empty, close the
> bfd here.
>
I think now you broke it in a different way. Now we can end
up trying to read from a closed bfd.
And just wondering, why not simply:
Index: gdb/exec.c
===================================================================
RCS file: /cvs/src/src/gdb/exec.c,v
retrieving revision 1.90
diff -u -p -r1.90 exec.c
--- gdb/exec.c 2 Jul 2009 17:21:06 -0000 1.90
+++ gdb/exec.c 28 Jul 2009 14:58:16 -0000
@@ -381,6 +381,7 @@ add_to_section_table (bfd *abfd, struct
struct target_section **table_pp = (struct
target_section **) table_pp_char;
flagword aflag;
+ (*table_pp)->bfd = abfd;
/* Check the section flags, but do not discard
zero-length sections, since
some symbols may still be attached to this section.
For instance, we
encountered on sparc-solaris 2.10 a shared library
with an empty .bss
@@ -390,7 +391,6 @@ add_to_section_table (bfd *abfd, struct
if (!(aflag & SEC_ALLOC))
return;
- (*table_pp)->bfd = abfd;
(*table_pp)->the_bfd_section = asect;
(*table_pp)->addr = bfd_section_vma (abfd, asect);
(*table_pp)->endaddr = (*table_pp)->addr +
bfd_section_size (abfd, asect);
--
Aleksandar Ristovski
QNX Software Systems
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 16:37 ` Pedro Alves
@ 2009-07-28 21:48 ` Aleksandar Ristovski
2009-08-08 16:54 ` Pedro Alves
0 siblings, 1 reply; 11+ messages in thread
From: Aleksandar Ristovski @ 2009-07-28 21:48 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
Pedro Alves wrote:
> On Tuesday 28 July 2009 16:16:23, Aleksandar Ristovski wrote:
>> Pedro Alves wrote:
>> I think now you broke it in a different way. Now we can end
>> up trying to read from a closed bfd.
>
> Ooops, you're right. There are uses of the bfd after transfering
> its ownership to the bfd target with target_bfd_reopen, and closing
> the bfd target (target_close)... This target is modeled on fdopen,
> which is why I blindly assumed it wasn't happening. I've reverted
> that patch.
>
>> And just wondering, why not simply:
>>
>> Index: gdb/exec.c
>> ===================================================================
>> RCS file: /cvs/src/src/gdb/exec.c,v
>> retrieving revision 1.90
>> diff -u -p -r1.90 exec.c
>> --- gdb/exec.c 2 Jul 2009 17:21:06 -0000 1.90
>> +++ gdb/exec.c 28 Jul 2009 14:58:16 -0000
>> @@ -381,6 +381,7 @@ add_to_section_table (bfd *abfd, struct
>> struct target_section **table_pp = (struct
>> target_section **) table_pp_char;
>> flagword aflag;
>>
>> + (*table_pp)->bfd = abfd;
>> /* Check the section flags, but do not discard
>> zero-length sections, since
>> some symbols may still be attached to this section.
>> For instance, we
>> encountered on sparc-solaris 2.10 a shared library
>> with an empty .bss
>> @@ -390,7 +391,6 @@ add_to_section_table (bfd *abfd, struct
>> if (!(aflag & SEC_ALLOC))
>> return;
>>
>> - (*table_pp)->bfd = abfd;
>> (*table_pp)->the_bfd_section = asect;
>> (*table_pp)->addr = bfd_section_vma (abfd, asect);
>> (*table_pp)->endaddr = (*table_pp)->addr +
>> bfd_section_size (abfd, asect);
>
> Still not right, because that's still papering over the problem, and
> still hitting undefined behaviour, in the case of the
> table ending up being empty. When table->sections == table->sections_end,
> we should never dereference table->sections, like in 'table->sections->bfd'.
> Notice how the end pointer isn't advanced if !SEC_ALLOC.
> Consider the fact that we usually xmalloc enough memory that
> makes that not misbehave a coincidence. E.g., see that with
> a resize_section_table call, you can end up with table->sections == NULL,
> and table->section_end == NULL, which is legal, because table->sections
> is still equal to table->sections_end in that case (meaning empty table).
>
> There used to be an extra structure in bfd_target.c to hold
> the sections and the bfd, which didn't look necessary when I
> reimplemented bfd-target.c on top of exec.c's functions, but
> it is clear now that we need it anyway. Here's a patch that
> brings something like that back.
>
> Could you try it? Thanks.
>
I tried it, it works.
Thanks,
--
Aleksandar Ristovski
QNX Software Systems
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [patch] Set bfd field in target_section
2009-07-28 21:48 ` Aleksandar Ristovski
@ 2009-08-08 16:54 ` Pedro Alves
0 siblings, 0 replies; 11+ messages in thread
From: Pedro Alves @ 2009-08-08 16:54 UTC (permalink / raw)
To: gdb-patches; +Cc: Aleksandar Ristovski
On Tuesday 28 July 2009 20:51:34, Aleksandar Ristovski wrote:
> Pedro Alves wrote:
> > There used to be an extra structure in bfd_target.c to hold
> > the sections and the bfd, which didn't look necessary when I
> > reimplemented bfd-target.c on top of exec.c's functions, but
> > it is clear now that we need it anyway. Here's a patch that
> > brings something like that back.
> >
(actually, there never was such a thing, I must have
dreamed about it. :-) The bfd used to be stored directly in
target_ops->to_data, and once upon a time, there used to be
target_ops->to_sections|target_ops->to_sections_end pointers.)
> > Could you try it? Thanks.
> >
> I tried it, it works.
Thanks, I've applied it.
--
Pedro Alves
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2009-08-08 16:39 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-28 14:46 [patch] Set bfd field in target_section Aleksandar Ristovski
2009-07-28 14:51 ` Pedro Alves
2009-07-28 14:59 ` Pedro Alves
2009-07-28 15:06 ` Aleksandar Ristovski
2009-07-28 16:22 ` Pedro Alves
2009-07-28 16:37 ` Aleksandar Ristovski
2009-07-28 16:37 ` Pedro Alves
2009-07-28 21:48 ` Aleksandar Ristovski
2009-08-08 16:54 ` Pedro Alves
2009-07-28 15:16 ` Pedro Alves
2009-07-28 15:57 ` Aleksandar Ristovski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox