aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-06-14 13:12:00 +0930
committerAlan Modra <amodra@gmail.com>2016-06-14 13:12:00 +0930
commitb0cffb47671ffbaac559c1f17a9f248256ea6c42 (patch)
tree8a671e9057ebcd1cc30e15f0caedc9b6bcad32ac /bfd
parent57bc0e78e9d1fc318e1265f22280e1c3b7527d65 (diff)
downloadgdb-b0cffb47671ffbaac559c1f17a9f248256ea6c42.zip
gdb-b0cffb47671ffbaac559c1f17a9f248256ea6c42.tar.gz
gdb-b0cffb47671ffbaac559c1f17a9f248256ea6c42.tar.bz2
Set my_archive for thin archives
LTO plugin support in plugin_maybe_claim wants to close the IR bfd after replacing it with the recompiled object, but can't do so for archive elements due to various pointers that access the archive bfd. Thin archives have the same problem. They too cannot have their element bfds closed. PR ld/20241 bfd/ * archive.c (open_nested_file): Set my_archive. * bfd.c (_bfd_default_error_handler <%B>): Exclude archive file name for thin archives. * bfdio.c (bfd_tell): Don't adjust origin for thin archives. (bfd_seek): Likewise. * bfdwin.c (bfd_get_file_window): Likewise. * cache.c (cache_bmmap): Likewise. (bfd_cache_lookup_worker): Don't look in my_archive for thin archives. * mach-o.c (bfd_mach_o_follow_dsym): Don't open my_archive for thin archives. * plugin.c (try_claim): Likewise. * xcofflink.c (xcoff_link_add_dynamic_symbols): Use import path of file within thin archive, not the archive. binutils/ * bucomm.c (bfd_get_archive_filename): Return file name within thin archive. ld/ * ldmain.c (add_archive_element): Just print file name of file within thin archives. * ldmisc.c (vfinfo): Likewise. * plugin.c (plugin_object_p): Open file within thin archives. (plugin_maybe_claim): Expand comment.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog17
-rw-r--r--bfd/archive.c1
-rw-r--r--bfd/bfd.c3
-rw-r--r--bfd/bfdio.c8
-rw-r--r--bfd/bfdwin.c3
-rw-r--r--bfd/cache.c6
-rw-r--r--bfd/mach-o.c2
-rw-r--r--bfd/plugin.c4
-rw-r--r--bfd/xcofflink.c2
9 files changed, 35 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9cfd09e..db25f2e 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,20 @@
+2016-06-14 Alan Modra <amodra@gmail.com>
+
+ PR ld/20241
+ * archive.c (open_nested_file): Set my_archive.
+ * bfd.c (_bfd_default_error_handler <%B>): Exclude archive file name
+ for thin archives.
+ * bfdio.c (bfd_tell): Don't adjust origin for thin archives.
+ (bfd_seek): Likewise.
+ * bfdwin.c (bfd_get_file_window): Likewise.
+ * cache.c (cache_bmmap): Likewise.
+ (bfd_cache_lookup_worker): Don't look in my_archive for thin archives.
+ * mach-o.c (bfd_mach_o_follow_dsym): Don't open my_archive for
+ thin archives.
+ * plugin.c (try_claim): Likewise.
+ * xcofflink.c (xcoff_link_add_dynamic_symbols): Use import path of
+ file within thin archive, not the archive.
+
2016-06-13 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20244
diff --git a/bfd/archive.c b/bfd/archive.c
index 6fc5f1d..7f94376 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -392,6 +392,7 @@ open_nested_file (const char *filename, bfd *archive)
{
n_bfd->lto_output = archive->lto_output;
n_bfd->no_export = archive->no_export;
+ n_bfd->my_archive = archive;
}
return n_bfd;
}
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 7400c4e..26143f9 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -703,7 +703,8 @@ _bfd_default_error_handler (const char *fmt, ...)
if (abfd == NULL)
/* Invoking %B with a null bfd pointer is an internal error. */
abort ();
- else if (abfd->my_archive)
+ else if (abfd->my_archive
+ && !bfd_is_thin_archive (abfd->my_archive))
snprintf (bufp, avail, "%s(%s)",
abfd->my_archive->filename, abfd->filename);
else
diff --git a/bfd/bfdio.c b/bfd/bfdio.c
index 55deb3b..71991bd 100644
--- a/bfd/bfdio.c
+++ b/bfd/bfdio.c
@@ -234,7 +234,8 @@ bfd_tell (bfd *abfd)
bfd *parent_bfd = abfd;
ptr = abfd->iovec->btell (abfd);
- while (parent_bfd->my_archive != NULL)
+ while (parent_bfd->my_archive != NULL
+ && !bfd_is_thin_archive (parent_bfd->my_archive))
{
ptr -= parent_bfd->origin;
parent_bfd = parent_bfd->my_archive;
@@ -289,7 +290,7 @@ bfd_seek (bfd *abfd, file_ptr position, int direction)
if (direction == SEEK_CUR && position == 0)
return 0;
- if (abfd->format != bfd_archive && abfd->my_archive == 0)
+ if (abfd->my_archive == NULL || bfd_is_thin_archive (abfd->my_archive))
{
if (direction == SEEK_SET && (bfd_vma) position == abfd->where)
return 0;
@@ -314,7 +315,8 @@ bfd_seek (bfd *abfd, file_ptr position, int direction)
{
bfd *parent_bfd = abfd;
- while (parent_bfd->my_archive != NULL)
+ while (parent_bfd->my_archive != NULL
+ && !bfd_is_thin_archive (parent_bfd->my_archive))
{
file_position += parent_bfd->origin;
parent_bfd = parent_bfd->my_archive;
diff --git a/bfd/bfdwin.c b/bfd/bfdwin.c
index 1aaee2c..f3faba4 100644
--- a/bfd/bfdwin.c
+++ b/bfd/bfdwin.c
@@ -144,7 +144,8 @@ bfd_get_file_window (bfd *abfd,
int fd;
/* Find the real file and the real offset into it. */
- while (abfd->my_archive != NULL)
+ while (abfd->my_archive != NULL
+ && !bfd_is_thin_archive (abfd->my_archive))
{
offset += abfd->origin;
abfd = abfd->my_archive;
diff --git a/bfd/cache.c b/bfd/cache.c
index 995cf1f..8efbcb9 100644
--- a/bfd/cache.c
+++ b/bfd/cache.c
@@ -241,7 +241,8 @@ bfd_cache_lookup_worker (bfd *abfd, enum cache_flag flag)
if ((abfd->flags & BFD_IN_MEMORY) != 0)
abort ();
- while (abfd->my_archive)
+ while (abfd->my_archive != NULL
+ && !bfd_is_thin_archive (abfd->my_archive))
abfd = abfd->my_archive;
if (abfd->iostream != NULL)
@@ -466,7 +467,8 @@ cache_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
pagesize_m1 = getpagesize () - 1;
/* Handle archive members. */
- if (abfd->my_archive != NULL)
+ if (abfd->my_archive != NULL
+ && !bfd_is_thin_archive (abfd->my_archive))
offset += abfd->origin;
/* Align. */
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index 85ce857..1609980 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -5708,7 +5708,7 @@ bfd_mach_o_follow_dsym (bfd *abfd)
if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_mach_o_flavour)
return NULL;
- if (abfd->my_archive)
+ if (abfd->my_archive && !bfd_is_thin_archive (abfd->my_archive))
base_bfd = abfd->my_archive;
/* BFD may have been opened from a stream. */
if (base_bfd->filename == NULL)
diff --git a/bfd/plugin.c b/bfd/plugin.c
index c81a267..559fcd4 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -167,7 +167,7 @@ try_claim (bfd *abfd)
file.name = abfd->filename;
- if (abfd->my_archive)
+ if (abfd->my_archive && !bfd_is_thin_archive (abfd->my_archive))
{
iobfd = abfd->my_archive;
file.offset = abfd->origin;
@@ -185,7 +185,7 @@ try_claim (bfd *abfd)
file.fd = fileno ((FILE *) iobfd->iostream);
- if (!abfd->my_archive)
+ if (!abfd->my_archive || bfd_is_thin_archive (abfd->my_archive))
{
struct stat stat_buf;
if (fstat (file.fd, &stat_buf))
diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c
index de7a992..d3653e3 100644
--- a/bfd/xcofflink.c
+++ b/bfd/xcofflink.c
@@ -997,7 +997,7 @@ xcoff_link_add_dynamic_symbols (bfd *abfd, struct bfd_link_info *info)
return FALSE;
n->next = NULL;
- if (abfd->my_archive == NULL)
+ if (abfd->my_archive == NULL || bfd_is_thin_archive (abfd->my_archive))
{
if (!bfd_xcoff_split_import_path (abfd, abfd->filename,
&n->path, &n->file))