* 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.
This commit is contained in:
parent
4f69f4c267
commit
a988325c24
13 changed files with 164 additions and 3 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 >>>>>><<>>>>>>><
|
||||
|
|
|
@ -64,6 +64,8 @@ sam1f: .ascii "<"
|
|||
.byte 0x11
|
||||
.ascii "<<<<<<<<"
|
||||
|
||||
leal bar@SECREL32+44(%eax), %edx
|
||||
|
||||
.section .rdata
|
||||
|
||||
.ascii ">>>>"
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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__ = . ;}
|
||||
|
|
|
@ -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…
Reference in a new issue