Commit 9870fe4f by Rafael Avila de Espindola Committed by Rafael Espindola

lto-elf.c (lto_file_init): Add offset argument.

2009-11-17  Rafael Avila de Espindola  <espindola@google.com>

	* lto-elf.c (lto_file_init): Add offset argument.
	(lto_elf_file_open): Record the offset.
	* lto.c (lto_resolution_read): Change file_name into a lto_file
	argument. Check offsets.
	(lto_file_read): Update call to lto_resolution_read.
	* lto.h (lto_file_struct): Add the offset field.

From-SVN: r154251
parent 6ca19a97
2009-11-17 Rafael Avila de Espindola <espindola@google.com>
* lto-elf.c (lto_file_init): Add offset argument.
(lto_elf_file_open): Record the offset.
* lto.c (lto_resolution_read): Change file_name into a lto_file
argument. Check offsets.
(lto_file_read): Update call to lto_resolution_read.
* lto.h (lto_file_struct): Add the offset field.
2009-11-16 Rafael Avila de Espindola <espindola@google.com> 2009-11-16 Rafael Avila de Espindola <espindola@google.com>
* lto-elf.c (lto_elf_file_open): Use strtoll to parse the offset. * lto-elf.c (lto_elf_file_open): Use strtoll to parse the offset.
......
...@@ -32,9 +32,10 @@ along with GCC; see the file COPYING3. If not see ...@@ -32,9 +32,10 @@ along with GCC; see the file COPYING3. If not see
/* Initialize FILE, an LTO file object for FILENAME. */ /* Initialize FILE, an LTO file object for FILENAME. */
static void static void
lto_file_init (lto_file *file, const char *filename) lto_file_init (lto_file *file, const char *filename, off_t offset)
{ {
file->filename = filename; file->filename = filename;
file->offset = offset;
} }
/* An ELF file. */ /* An ELF file. */
...@@ -542,6 +543,7 @@ lto_elf_file_open (const char *filename, bool writable) ...@@ -542,6 +543,7 @@ lto_elf_file_open (const char *filename, bool writable)
lto_elf_file *elf_file; lto_elf_file *elf_file;
lto_file *result = NULL; lto_file *result = NULL;
off_t offset; off_t offset;
off_t header_offset;
const char *offset_p; const char *offset_p;
char *fname; char *fname;
...@@ -550,6 +552,7 @@ lto_elf_file_open (const char *filename, bool writable) ...@@ -550,6 +552,7 @@ lto_elf_file_open (const char *filename, bool writable)
{ {
fname = xstrdup (filename); fname = xstrdup (filename);
offset = 0; offset = 0;
header_offset = 0;
} }
else else
{ {
...@@ -567,13 +570,13 @@ lto_elf_file_open (const char *filename, bool writable) ...@@ -567,13 +570,13 @@ lto_elf_file_open (const char *filename, bool writable)
/* elf_rand expects the offset to point to the ar header, not the /* elf_rand expects the offset to point to the ar header, not the
object itself. Subtract the size of the ar header (60 bytes). object itself. Subtract the size of the ar header (60 bytes).
We don't uses sizeof (struct ar_hd) to avoid including ar.h */ We don't uses sizeof (struct ar_hd) to avoid including ar.h */
offset -= 60; header_offset = offset - 60;
} }
/* Set up. */ /* Set up. */
elf_file = XCNEW (lto_elf_file); elf_file = XCNEW (lto_elf_file);
result = (lto_file *) elf_file; result = (lto_file *) elf_file;
lto_file_init (result, fname); lto_file_init (result, fname, offset);
elf_file->fd = -1; elf_file->fd = -1;
/* Open the file. */ /* Open the file. */
...@@ -603,8 +606,8 @@ lto_elf_file_open (const char *filename, bool writable) ...@@ -603,8 +606,8 @@ lto_elf_file_open (const char *filename, bool writable)
if (offset != 0) if (offset != 0)
{ {
Elf *e; Elf *e;
off_t t = elf_rand (elf_file->elf, offset); off_t t = elf_rand (elf_file->elf, header_offset);
if (t != offset) if (t != header_offset)
{ {
error ("could not seek in archive"); error ("could not seek in archive");
goto fail; goto fail;
......
...@@ -254,7 +254,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data, ...@@ -254,7 +254,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
size is written to SIZE. */ size is written to SIZE. */
static VEC(ld_plugin_symbol_resolution_t,heap) * static VEC(ld_plugin_symbol_resolution_t,heap) *
lto_resolution_read (FILE *resolution, const char *file_name) lto_resolution_read (FILE *resolution, lto_file *file)
{ {
/* We require that objects in the resolution file are in the same /* We require that objects in the resolution file are in the same
order as the lto1 command line. */ order as the lto1 command line. */
...@@ -268,15 +268,30 @@ lto_resolution_read (FILE *resolution, const char *file_name) ...@@ -268,15 +268,30 @@ lto_resolution_read (FILE *resolution, const char *file_name)
if (!resolution) if (!resolution)
return NULL; return NULL;
name_len = strlen (file_name); name_len = strlen (file->filename);
obj_name = XNEWVEC (char, name_len + 1); obj_name = XNEWVEC (char, name_len + 1);
fscanf (resolution, " "); /* Read white space. */ fscanf (resolution, " "); /* Read white space. */
fread (obj_name, sizeof (char), name_len, resolution); fread (obj_name, sizeof (char), name_len, resolution);
obj_name[name_len] = '\0'; obj_name[name_len] = '\0';
if (strcmp (obj_name, file_name) != 0) if (strcmp (obj_name, file->filename) != 0)
internal_error ("unexpected file name %s in linker resolution file. " internal_error ("unexpected file name %s in linker resolution file. "
"Expected %s", obj_name, file_name); "Expected %s", obj_name, file->filename);
if (file->offset != 0)
{
int t;
char offset_p[21];
long long offset;
t = fscanf (resolution, "@%20s", offset_p);
if (t != 1)
internal_error ("could not parse file offset");
errno = 0;
offset = strtoll(offset_p, NULL, 10);
if (errno != 0)
internal_error ("could not parse file offset");
if (offset != file->offset)
internal_error ("unexpected offset");
}
free (obj_name); free (obj_name);
...@@ -332,7 +347,7 @@ lto_file_read (lto_file *file, FILE *resolution_file) ...@@ -332,7 +347,7 @@ lto_file_read (lto_file *file, FILE *resolution_file)
size_t len; size_t len;
VEC(ld_plugin_symbol_resolution_t,heap) *resolutions; VEC(ld_plugin_symbol_resolution_t,heap) *resolutions;
resolutions = lto_resolution_read (resolution_file, file->filename); resolutions = lto_resolution_read (resolution_file, file);
file_data = XCNEW (struct lto_file_decl_data); file_data = XCNEW (struct lto_file_decl_data);
file_data->file_name = file->filename; file_data->file_name = file->filename;
......
...@@ -28,6 +28,7 @@ typedef struct lto_file_struct ...@@ -28,6 +28,7 @@ typedef struct lto_file_struct
{ {
/* The name of the file. */ /* The name of the file. */
const char *filename; const char *filename;
off_t offset;
} lto_file; } lto_file;
/* In lto-lang.c */ /* In lto-lang.c */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment