binutils/

2008-10-09  Kai Tietz  <kai.tietz@onevision.com>

	* dlltool.c (PAGE_SIZE): Make sure it has bfd_vma type.
	(PAGE_MASK): Likewise.
	(sfunc): Change to address size of bfd_vma for base-file.
	(flush_page): Likewise.
	(gen_exp_file): Likewise.
bfd/
2008-10-09  Kai Tietz  <kai.tietz@onevision.com>

	* cofflink.c (_bfd_coff_generic_relocate_section): Dump bfd_vma sized addresses instead of long sized.
This commit is contained in:
Kai Tietz
2008-10-09 09:00:08 +00:00
parent c8d104ad69
commit d078078ddb
4 changed files with 44 additions and 21 deletions

View File

@@ -1,3 +1,7 @@
2008-10-09 Kai Tietz <kai.tietz@onevision.com>
* cofflink.c (_bfd_coff_generic_relocate_section): Dump bfd_vma sized addresses instead of long sized.
2008-10-09 Alan Modra <amodra@bigpond.net.au> 2008-10-09 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Don't attempt to * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Don't attempt to

View File

@@ -2985,16 +2985,16 @@ _bfd_coff_generic_relocate_section (bfd *output_bfd,
absolute. We output the address here to a file. absolute. We output the address here to a file.
This file is then read by dlltool when generating the This file is then read by dlltool when generating the
reloc section. Note that the base file is not reloc section. Note that the base file is not
portable between systems. We write out a long here, portable between systems. We write out a bfd_vma here,
and dlltool reads in a long. */ and dlltool reads in a bfd_vma. */
long addr = (rel->r_vaddr bfd_vma addr = (rel->r_vaddr
- input_section->vma - input_section->vma
+ input_section->output_offset + input_section->output_offset
+ input_section->output_section->vma); + input_section->output_section->vma);
if (coff_data (output_bfd)->pe) if (coff_data (output_bfd)->pe)
addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; addr -= pe_data(output_bfd)->pe_opthdr.ImageBase;
if (fwrite (&addr, 1, sizeof (long), (FILE *) info->base_file) if (fwrite (&addr, 1, sizeof (bfd_vma), (FILE *) info->base_file)
!= sizeof (long)) != sizeof (bfd_vma))
{ {
bfd_set_error (bfd_error_system_call); bfd_set_error (bfd_error_system_call);
return FALSE; return FALSE;

View File

@@ -1,3 +1,11 @@
2008-10-09 Kai Tietz <kai.tietz@onevision.com>
* dlltool.c (PAGE_SIZE): Make sure it has bfd_vma type.
(PAGE_MASK): Likewise.
(sfunc): Change to address size of bfd_vma for base-file.
(flush_page): Likewise.
(gen_exp_file): Likewise.
2008-10-07 Jan Kratochvil <jan.kratochvil@redhat.com> 2008-10-07 Jan Kratochvil <jan.kratochvil@redhat.com>
* readelf.c (process_section_headers): Do not cut the section names and * readelf.c (process_section_headers): Do not cut the section names and

View File

@@ -241,8 +241,8 @@
#define show_allnames 0 #define show_allnames 0
#define PAGE_SIZE 4096 #define PAGE_SIZE ((bfd_vma) 4096)
#define PAGE_MASK (-PAGE_SIZE) #define PAGE_MASK ((bfd_vma) (-4096))
#include "sysdep.h" #include "sysdep.h"
#include "bfd.h" #include "bfd.h"
#include "libiberty.h" #include "libiberty.h"
@@ -712,7 +712,7 @@ static void scan_open_obj_file (bfd *);
static void scan_obj_file (const char *); static void scan_obj_file (const char *);
static void dump_def_info (FILE *); static void dump_def_info (FILE *);
static int sfunc (const void *, const void *); static int sfunc (const void *, const void *);
static void flush_page (FILE *, long *, int, int); static void flush_page (FILE *, bfd_vma *, bfd_vma, int);
static void gen_def_file (void); static void gen_def_file (void);
static void generate_idata_ofile (FILE *); static void generate_idata_ofile (FILE *);
static void assemble_file (const char *, const char *); static void assemble_file (const char *, const char *);
@@ -1584,18 +1584,21 @@ dump_def_info (FILE *f)
static int static int
sfunc (const void *a, const void *b) sfunc (const void *a, const void *b)
{ {
return *(const long *) a - *(const long *) b; if (*(const bfd_vma *) a == *(const bfd_vma *) b)
return 0;
return ((*(const bfd_vma *) a > *(const bfd_vma *) b) ? 1 : -1);
} }
static void static void
flush_page (FILE *f, long *need, int page_addr, int on_page) flush_page (FILE *f, bfd_vma *need, bfd_vma page_addr, int on_page)
{ {
int i; int i;
/* Flush this page. */ /* Flush this page. */
fprintf (f, "\t%s\t0x%08x\t%s Starting RVA for chunk\n", fprintf (f, "\t%s\t0x%08x\t%s Starting RVA for chunk\n",
ASM_LONG, ASM_LONG,
page_addr, (int) page_addr,
ASM_C); ASM_C);
fprintf (f, "\t%s\t0x%x\t%s Size of block\n", fprintf (f, "\t%s\t0x%x\t%s Size of block\n",
ASM_LONG, ASM_LONG,
@@ -1604,12 +1607,20 @@ flush_page (FILE *f, long *need, int page_addr, int on_page)
for (i = 0; i < on_page; i++) for (i = 0; i < on_page; i++)
{ {
unsigned long needed = need[i]; bfd_vma needed = need[i];
if (needed) if (needed)
{
#ifndef DLLTOOL_MX86_64
/* Relocation via HIGHLOW. */
needed = ((needed - page_addr) | 0x3000) & 0xffff; needed = ((needed - page_addr) | 0x3000) & 0xffff;
#else
/* Relocation via DIR64. */
needed = ((needed - page_addr) | 0xa000) & 0xffff;
#endif
}
fprintf (f, "\t%s\t0x%lx\n", ASM_SHORT, needed); fprintf (f, "\t%s\t0x%lx\n", ASM_SHORT, (long) needed);
} }
/* And padding */ /* And padding */
@@ -1977,12 +1988,12 @@ gen_exp_file (void)
/* Dump the reloc section if a base file is provided. */ /* Dump the reloc section if a base file is provided. */
if (base_file) if (base_file)
{ {
int addr; bfd_vma addr;
long need[PAGE_SIZE]; bfd_vma need[PAGE_SIZE];
long page_addr; bfd_vma page_addr;
int numbytes; int numbytes;
int num_entries; int num_entries;
long *copy; bfd_vma *copy;
int j; int j;
int on_page; int on_page;
fprintf (f, "\t.section\t.init\n"); fprintf (f, "\t.section\t.init\n");
@@ -1993,7 +2004,7 @@ gen_exp_file (void)
fseek (base_file, 0, SEEK_SET); fseek (base_file, 0, SEEK_SET);
copy = xmalloc (numbytes); copy = xmalloc (numbytes);
fread (copy, 1, numbytes, base_file); fread (copy, 1, numbytes, base_file);
num_entries = numbytes / sizeof (long); num_entries = numbytes / sizeof (bfd_vma);
fprintf (f, "\t.section\t.reloc\n"); fprintf (f, "\t.section\t.reloc\n");
@@ -2001,8 +2012,8 @@ gen_exp_file (void)
{ {
int src; int src;
int dst = 0; int dst = 0;
int last = -1; bfd_vma last = (bfd_vma) -1;
qsort (copy, num_entries, sizeof (long), sfunc); qsort (copy, num_entries, sizeof (bfd_vma), sfunc);
/* Delete duplicates */ /* Delete duplicates */
for (src = 0; src < num_entries; src++) for (src = 0; src < num_entries; src++)
{ {