Re: [RFA] Check solib bfd arch

Hui Zhu
2009-07-08T02:46:54Z

[-- Attachment #1: Type: text/plain, Size: 2106 bytes --]

On Wed, Jul 8, 2009 at 00:45, Ulrich Weigand<uweigand@de.ibm.com> wrote:
> Hui Zhu wrote:
>
>> +  /* Check bfd arch.  */
>> +  b = gdbarch_bfd_arch_info (target_gdbarch);
>> +  if (b->compatible (b, bfd_get_arch_info (abfd)) != b)
>> +    {
>> +      bfd_close (abfd);
>> +      make_cleanup (xfree, found_pathname);
>> +      error (_("`%s': ARCH not same with inferior."), found_pathname);
>> +    }
>
> I'm not sure this should be an error; we allow debugging a main
> executable whose architecture does not match the target architecture
> (if the user knows what they're doing), so IMO we should allow this
> for shared libraries too.  A *warning* would be more appropriate.
>
> Also, I think it would be good if the message mentioned the architecture
> in question, along the lines of:
>
>  warning (_("`%s': Shared library architecture %s is not compatible "
>             "with target architecture %s."), found_pathname,
>           bfd_get_arch_info (abfd)->printable_name, b->printable_name);
>

Agree with you. I make a new patch for it.
Please help me review it. Thanks.

Hui

2009-07-08 Hui Zhu <teawater@gmail.com>

* solib.c (solib_bfd_open): Output a warning if solib's
architecture is not compatible with inferior's architecture.

---
solib.c | 8 ++++++++
1 file changed, 8 insertions(+)

--- a/solib.c
+++ b/solib.c
@@ -289,6 +289,7 @@ solib_bfd_open (char *pathname)
char *found_pathname;
int found_file;
bfd *abfd;
+ const struct bfd_arch_info *b;

/* Use target-specific override if present. */
if (ops->bfd_open)
@@ -311,6 +312,13 @@ solib_bfd_open (char *pathname)
found_pathname, bfd_errmsg (bfd_get_error ()));
}

+ /* Check bfd arch. */
+ b = gdbarch_bfd_arch_info (target_gdbarch);
+ if (b->compatible (b, bfd_get_arch_info (abfd)) != b)
+ warning (_("`%s': Shared library architecture %s is not compatible "
+ "with target architecture %s."), found_pathname,
+ bfd_get_arch_info (abfd)->printable_name, b->printable_name);
+
return abfd;
}

[-- Attachment #2: solib-check-bfd_arch_info.txt --]
[-- Type: text/plain, Size: 795 bytes --]

---
solib.c | 8 ++++++++
1 file changed, 8 insertions(+)

--- a/solib.c
+++ b/solib.c
@@ -289,6 +289,7 @@ solib_bfd_open (char *pathname)
char *found_pathname;
int found_file;
bfd *abfd;
+ const struct bfd_arch_info *b;

/* Use target-specific override if present. */
if (ops->bfd_open)
@@ -311,6 +312,13 @@ solib_bfd_open (char *pathname)
found_pathname, bfd_errmsg (bfd_get_error ()));
}

+ /* Check bfd arch. */
+ b = gdbarch_bfd_arch_info (target_gdbarch);
+ if (b->compatible (b, bfd_get_arch_info (abfd)) != b)
+ warning (_("`%s': Shared library architecture %s is not compatible "
+ "with target architecture %s."), found_pathname,
+ bfd_get_arch_info (abfd)->printable_name, b->printable_name);
+
return abfd;
}