Browse Source

* config/tc-i386.c (lex_got): Provide implementation for PE

format.

	* gas/i386/secrel.s: Add test of <symbol>@SECREL32.
	* gas/i386/secrel.d: Add expected disassembly.

	* scripttempl/pe.sc (R_TLS): Add .tls$AAA and .tls$ZZZ.
	* scripttempl/pep.sc (R_TLS): Add .tls$AAA and .tls$ZZZ.

	* archive.c (_bfd_delete_archive_data): New function.
	* libbfd-in.h (_bfd_delete_archive_data): Declare.
	* libbfd.h: Rebuild.
	* opncls.c (_bfd_delete_bfd): Call _bfd_delete_archive_data.
gdb_7_6-branch
Nick Clifton 14 years ago
parent
commit
a988325c24
  1. 7
      bfd/ChangeLog
  2. 13
      bfd/archive.c
  3. 2
      bfd/libbfd-in.h
  4. 2
      bfd/libbfd.h
  5. 4
      bfd/opncls.c
  6. 5
      gas/ChangeLog
  7. 103
      gas/config/tc-i386.c
  8. 5
      gas/testsuite/ChangeLog
  9. 3
      gas/testsuite/gas/i386/secrel.d
  10. 2
      gas/testsuite/gas/i386/secrel.s
  11. 5
      ld/ChangeLog
  12. 8
      ld/scripttempl/pe.sc
  13. 8
      ld/scripttempl/pep.sc

7
bfd/ChangeLog

@ -1,3 +1,10 @@
2012-08-07 Tom Tromey <tromey@redhat.com>
* archive.c (_bfd_delete_archive_data): New function.
* libbfd-in.h (_bfd_delete_archive_data): Declare.
* libbfd.h: Rebuild.
* opncls.c (_bfd_delete_bfd): Call _bfd_delete_archive_data.
2012-08-07 Nick Clifton <nickc@redhat.com>
* po/uk.po: Updated Ukranian translation.

13
bfd/archive.c

@ -293,6 +293,19 @@ bfd_set_archive_head (bfd *output_archive, bfd *new_head)
return TRUE;
}
/* Free the archive hash table, if it exists. */
void
_bfd_delete_archive_data (bfd *abfd)
{
struct artdata *ardata = bfd_ardata (abfd);
BFD_ASSERT (abfd->format == bfd_archive);
if (ardata && ardata->cache)
htab_delete (ardata->cache);
}
bfd *
_bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos)
{

2
bfd/libbfd-in.h

@ -130,6 +130,8 @@ extern void bfd_release
bfd * _bfd_create_empty_archive_element_shell
(bfd *obfd);
void _bfd_delete_archive_data
(bfd *abfd);
bfd * _bfd_look_for_bfd_in_cache
(bfd *, file_ptr);
bfd_boolean _bfd_add_bfd_to_archive_cache

2
bfd/libbfd.h

@ -135,6 +135,8 @@ extern void bfd_release
bfd * _bfd_create_empty_archive_element_shell
(bfd *obfd);
void _bfd_delete_archive_data
(bfd *abfd);
bfd * _bfd_look_for_bfd_in_cache
(bfd *, file_ptr);
bfd_boolean _bfd_add_bfd_to_archive_cache

4
bfd/opncls.c

@ -130,11 +130,15 @@ _bfd_new_bfd_contained_in (bfd *obfd)
static void
_bfd_delete_bfd (bfd *abfd)
{
if (abfd->format == bfd_archive)
_bfd_delete_archive_data (abfd);
if (abfd->memory)
{
bfd_hash_table_free (&abfd->section_htab);
objalloc_free ((struct objalloc *) abfd->memory);
}
free (abfd);
}

5
gas/ChangeLog

@ -1,3 +1,8 @@
2012-08-07 Daniel Green <venix1@gmail.com>
* config/tc-i386.c (lex_got): Provide implementation for PE
format.
2012-08-06 Maciej W. Rozycki <macro@codesourcery.com>
* config/tc-mips.c (append_insn): Also handle moving delay-slot

103
gas/config/tc-i386.c

@ -6788,6 +6788,109 @@ lex_got (enum bfd_reloc_code_real *rel,
}
#endif
#ifdef TE_PE
#ifdef lex_got
#undef lex_got
#endif
/* Parse operands of the form
<symbol>@SECREL32+<nnn>
If we find one, set up the correct relocation in RELOC and copy the
input string, minus the `@SECREL32' into a malloc'd buffer for
parsing by the calling routine. Return this buffer, and if ADJUST
is non-null set it to the length of the string we removed from the
input line. Otherwise return NULL.
This function is copied from the ELF version above adjusted for PE targets. */
static char *
lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
int *adjust ATTRIBUTE_UNUSED,
i386_operand_type *types ATTRIBUTE_UNUSED)
{
static const struct
{
const char *str;
int len;
const enum bfd_reloc_code_real rel[2];
const i386_operand_type types64;
}
gotrel[] =
{
{ STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
BFD_RELOC_32_SECREL },
OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
};
char *cp;
unsigned j;
for (cp = input_line_pointer; *cp != '@'; cp++)
if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
return NULL;
for (j = 0; j < ARRAY_SIZE (gotrel); j++)
{
int len = gotrel[j].len;
if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
{
if (gotrel[j].rel[object_64bit] != 0)
{
int first, second;
char *tmpbuf, *past_reloc;
*rel = gotrel[j].rel[object_64bit];
if (adjust)
*adjust = len;
if (types)
{
if (flag_code != CODE_64BIT)
{
types->bitfield.imm32 = 1;
types->bitfield.disp32 = 1;
}
else
*types = gotrel[j].types64;
}
/* The length of the first part of our input line. */
first = cp - input_line_pointer;
/* The second part goes from after the reloc token until
(and including) an end_of_line char or comma. */
past_reloc = cp + 1 + len;
cp = past_reloc;
while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
++cp;
second = cp + 1 - past_reloc;
/* Allocate and copy string. The trailing NUL shouldn't
be necessary, but be safe. */
tmpbuf = (char *) xmalloc (first + second + 2);
memcpy (tmpbuf, input_line_pointer, first);
if (second != 0 && *past_reloc != ' ')
/* Replace the relocation token with ' ', so that
errors like foo@SECLREL321 will be detected. */
tmpbuf[first++] = ' ';
memcpy (tmpbuf + first, past_reloc, second);
tmpbuf[first + second] = '\0';
return tmpbuf;
}
as_bad (_("@%s reloc is not supported with %d-bit output format"),
gotrel[j].str, 1 << (5 + object_64bit));
return NULL;
}
}
/* Might be a symbol version string. Don't as_bad here. */
return NULL;
}
#endif /* TE_PE */
void
x86_cons (expressionS *exp, int size)
{

5
gas/testsuite/ChangeLog

@ -1,3 +1,8 @@
2012-08-07 Nick Clifton <nickc@redhat.com>
* gas/i386/secrel.s: Add test of <symbol>@SECREL32.
* gas/i386/secrel.d: Add expected disassembly.
2012-08-06 Maciej W. Rozycki <macro@codesourcery.com>
* gas/mips/mips.exp: Set has_newabi for all Linux targets.

3
gas/testsuite/gas/i386/secrel.d

@ -21,7 +21,7 @@ OFFSET[ ]+TYPE[ ]+VALUE
0+89 secrel32 ext2d
0+8e secrel32 ext36
0+93 secrel32 ext3f
0+a2 secrel32 bar
Contents of section \.text:
0000 3e3e3e3e 3c3c3c3c 3e3e3e3e 3e3c3c3c >>>><<<<>>>>><<<
@ -37,6 +37,7 @@ Contents of section \.data:
0070 0000111f 00000011 3c3c3c3c 3c3c3c3c ........<<<<<<<<
0080 3e3e3e3e 00000000 11000000 00110000 >>>>............
0090 00001100 00000011 3c3c3c3c 3c3c3c3c ........<<<<<<<<
00a0 8d902c00 00000000 ..,.....
Contents of section \.rdata:
0000 3e3e3e3e 3c3c3c3c 3e3e3e3e 3e3c3c3c >>>><<<<>>>>><<<
0010 3e3e3e3e 3e3e3c3c 3e3e3e3e 3e3e3e3c >>>>>><<>>>>>>><

2
gas/testsuite/gas/i386/secrel.s

@ -64,6 +64,8 @@ sam1f: .ascii "<"
.byte 0x11
.ascii "<<<<<<<<"
leal bar@SECREL32+44(%eax), %edx
.section .rdata
.ascii ">>>>"

5
ld/ChangeLog

@ -1,3 +1,8 @@
2012-08-07 Daniel Green <venix1@gmail.com>
* scripttempl/pe.sc (R_TLS): Add .tls$AAA and .tls$ZZZ.
* scripttempl/pep.sc (R_TLS): Add .tls$AAA and .tls$ZZZ.
2012-08-07 Nick Clifton <nickc@redhat.com>
* po/ja.po: Updated Japanese translation.

8
ld/scripttempl/pe.sc

@ -39,9 +39,11 @@ if test "${RELOCATING}"; then
R_CRT_XP='*(SORT(.CRT$XP*)) /* Pre-termination */'
R_CRT_XT='*(SORT(.CRT$XT*)) /* Termination */'
R_TLS='
*(.tls$AAA)
*(.tls)
*(.tls$)
*(SORT(.tls$*))'
*(SORT(.tls$*))
*(.tls$ZZZ)'
R_RSRC='*(SORT(.rsrc$*))'
else
R_TEXT=
@ -179,6 +181,10 @@ SECTIONS
${RELOCATING+___crt_xt_end__ = . ;}
}
/* Windows TLS expects .tls\$AAA to be at the start and .tls\$ZZZ to be
at the end of section. This is important because _tls_start MUST
be at the beginning of the section to enable SECREL32 relocations with TLS
data. */
.tls ${RELOCATING+BLOCK(__section_alignment__)} :
{
${RELOCATING+___tls_start__ = . ;}

8
ld/scripttempl/pep.sc

@ -39,9 +39,11 @@ if test "${RELOCATING}"; then
R_CRT_XP='*(SORT(.CRT$XP*)) /* Pre-termination */'
R_CRT_XT='*(SORT(.CRT$XT*)) /* Termination */'
R_TLS='
*(.tls$AAA)
*(.tls)
*(.tls$)
*(SORT(.tls$*))'
*(SORT(.tls$*))
*(.tls$ZZZ)'
R_RSRC='*(SORT(.rsrc$*))'
else
R_TEXT=
@ -185,6 +187,10 @@ SECTIONS
${RELOCATING+___crt_xt_end__ = . ;}
}
/* Windows TLS expects .tls\$AAA to be at the start and .tls\$ZZZ to be
at the end of the .tls section. This is important because _tls_start MUST
be at the beginning of the section to enable SECREL32 relocations with TLS
data. */
.tls ${RELOCATING+BLOCK(__section_alignment__)} :
{
${RELOCATING+___tls_start__ = . ;}

Loading…
Cancel
Save