/* ELF object file format
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002 Free Software Foundation, Inc.
+ 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
char *name;
char c;
char *p;
- int temp, size;
+ offsetT temp, size, sign;
symbolS *symbolP;
int have_align;
+ expressionS exp;
if (flag_mri && is_common)
{
return NULL;
}
input_line_pointer++; /* skip ',' */
- if ((temp = get_absolute_expression ()) < 0)
+ temp = get_absolute_expr (&exp);
+ sign = (offsetT) 1 << (stdoutput->arch_info->bits_per_address - 1);
+ size = temp & ((sign << 1) - 1);
+ if (temp != size || !exp.X_unsigned)
{
- as_bad (_(".COMMon length (%d.) <0! Ignored."), temp);
+ as_bad (_(".COMMon length (%ld) out of range, ignored."), (long) temp);
ignore_rest_of_line ();
return NULL;
}
- size = temp;
*p = 0;
symbolP = symbol_find_or_make (name);
*p = c;
{
if (S_GET_VALUE (symbolP) != (valueT) size)
{
- as_warn (_("length of .comm \"%s\" is already %ld; not changed to %d"),
- S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
+ as_warn (_("length of .comm \"%s\" is already %ld; not changed to %ld"),
+ S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP),
+ (long) size);
}
}
know (symbolP->sy_frag == &zero_address_frag);
temp = 0;
else
{
- temp = get_absolute_expression ();
- if (temp < 0)
+ temp = get_absolute_expr (&exp);
+ if (!exp.X_unsigned)
{
temp = 0;
as_warn (_("common alignment negative; 0 assumed"));
{ ".data", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
{ ".data1", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
{ ".debug", SHT_PROGBITS, 0 },
+#if defined (TC_HPPA) && !defined (TE_LINUX) && TARGET_ARCH_SIZE == 64
+ { ".fini", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
+ { ".init", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
+#else
{ ".fini", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
{ ".init", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
+#endif
{ ".line", SHT_PROGBITS, 0 },
{ ".note", SHT_NOTE, 0 },
{ ".rodata", SHT_PROGBITS, SHF_ALLOC },
if (type == SHT_NOBITS)
seg_info (sec)->bss = 1;
+ if (linkonce)
+ flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
bfd_set_section_flags (stdoutput, sec, flags);
if (flags & SEC_MERGE)
sec->entsize = entsize;
elf_group_name (sec) = group_name;
- elf_linkonce_p (sec) = linkonce;
/* Add a symbol for this section to the symbol table. */
secsym = symbol_find (name);
if (((old_sec->flags ^ flags)
& (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
| SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
- | SEC_THREAD_LOCAL))
- || linkonce != elf_linkonce_p (sec))
+ | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
+ | SEC_THREAD_LOCAL)))
as_warn (_("ignoring changed section attributes for %s"), name);
if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
as_warn (_("ignoring changed section entity size for %s"), name);
return SHF_ALLOC;
if (len == 9 && strncmp (str, "execinstr", 9) == 0)
return SHF_EXECINSTR;
+ if (len == 3 && strncmp (str, "tls", 3) == 0)
+ return SHF_TLS;
#ifdef md_elf_section_word
{
else if (strcmp (typename, "object") == 0
|| strcmp (typename, "STT_OBJECT") == 0)
type = BSF_OBJECT;
+ else if (strcmp (typename, "tls_object") == 0
+ || strcmp (typename, "STT_TLS") == 0)
+ type = BSF_OBJECT | BSF_THREAD_LOCAL;
#ifdef md_elf_symbol_type
else if ((type = md_elf_symbol_type (typename, sym, elfsym)) != -1)
;
flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
- if (elf_linkonce_p (s) != ((flags & SEC_LINK_ONCE) != 0))
+ if ((s->flags ^ flags) & SEC_LINK_ONCE)
{
flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
if (s != list.head[i])