]> granicus.if.org Git - yasm/commitdiff
Fix GAS section alignment, at least for ELF output. In GAS mode, the
authorPeter Johnson <peter@tortall.net>
Wed, 9 Nov 2005 06:05:58 +0000 (06:05 -0000)
committerPeter Johnson <peter@tortall.net>
Wed, 9 Nov 2005 06:05:58 +0000 (06:05 -0000)
section alignment is set to the maximum alignment used anywhere in the
section.

svn path=/trunk/yasm/; revision=1317

modules/objfmts/elf/elf-objfmt.c
modules/objfmts/elf/elf.c
modules/objfmts/elf/elf.h
modules/parsers/gas/gas-bison.y
modules/parsers/gas/tests/datavis2.hex
modules/parsers/gas/tests/gassectalign.asm
modules/parsers/gas/tests/gassectalign.hex

index 5aaec99e568075fa97a42250bc7d96cc9af0af66..053313439c28d201a0a7b3d7cd9c4d63a1d9ce5c 100644 (file)
@@ -772,6 +772,7 @@ elf_objfmt_section_switch(yasm_objfmt *objfmt, yasm_valparamhead *valparams,
        type = SHT_PROGBITS;
        flags = SHF_ALLOC + SHF_EXECINSTR;
     } else if (strcmp(sectname, ".comment") == 0) {
+       align = 0;
        type = SHT_PROGBITS;
        flags = 0;
     } else {
@@ -918,13 +919,20 @@ elf_objfmt_section_align(/*@unused@*/ yasm_objfmt *objfmt, yasm_section *sect,
                         unsigned long align, unsigned long line)
 {
     /*@dependent@*/ /*@null@*/ elf_secthead *esd;
+    const yasm_intnum *old_align_intn;
+    unsigned long old_align = 0;
 
     esd = yasm_section_get_data(sect, &elf_section_data);
 
     if (!esd)
        yasm_internal_error(N_("NULL elf section data in section_align"));
 
-    elf_secthead_set_align(esd, yasm_intnum_create_uint(align));
+    old_align_intn = elf_secthead_get_align(esd);
+    if (old_align_intn)
+       old_align = yasm_intnum_get_uint(old_align_intn);
+
+    if (align > old_align)
+       elf_secthead_set_align(esd, yasm_intnum_create_uint(align));
 }
 
 static yasm_symrec *
index 58fd69661719081a8dd08916236d69b3c0ab11c2..3e77556a513ff98093c47e6846b9afc510ba360c 100644 (file)
@@ -761,6 +761,12 @@ elf_secthead_get_index(elf_secthead *shead)
     return shead->index;
 }
 
+const yasm_intnum *
+elf_secthead_get_align(const elf_secthead *shead)
+{
+    return shead->align;
+}
+
 const yasm_intnum *
 elf_secthead_set_align(elf_secthead *shead, yasm_intnum *align)
 {
index bbd000b2ab50989f2a4159c6b0a2e005c7bb1371..fb6129a2b036f2ef6ad6f443826fee84f2e56b44 100644 (file)
@@ -463,6 +463,7 @@ void elf_secthead_append_reloc(yasm_section *sect, elf_secthead *shead,
 elf_section_type elf_secthead_get_type(elf_secthead *shead);
 int elf_secthead_is_empty(elf_secthead *shead);
 struct yasm_symrec *elf_secthead_get_sym(elf_secthead *shead);
+const struct yasm_intnum *elf_secthead_get_align(const elf_secthead *shead);
 const struct yasm_intnum *elf_secthead_set_align(elf_secthead *shead,
                                                 struct yasm_intnum *align);
 elf_section_index elf_secthead_get_index(elf_secthead *shead);
index c9298db99502e7b799517a4278597149e8f0eeab..8d132f48ad5af87858d4f5ab555be96eca4cfe45 100644 (file)
@@ -811,6 +811,7 @@ gas_parser_align(yasm_parser_gas *parser_gas, yasm_valparamhead *valparams,
 {
     /*@dependent@*/ yasm_valparam *bound, *fill = NULL, *maxskip = NULL;
     yasm_expr *boundval, *fillval = NULL, *maxskipval = NULL;
+    yasm_intnum *boundintn;
 
     bound = yasm_vps_first(valparams);
     boundval = bound->param;
@@ -844,26 +845,16 @@ gas_parser_align(yasm_parser_gas *parser_gas, yasm_valparamhead *valparams,
     /* If .align is the first bytecode in the section, it's really specifying
      * section alignment.
      */
-    if (parser_gas->prev_bc
-       == yasm_section_bcs_first(parser_gas->cur_section)) {
-       yasm_intnum *boundintn = yasm_expr_get_intnum(&boundval, NULL);
-       unsigned long boundint;
-       if (!boundintn) {
-           yasm__error(cur_line, N_("section alignment not constnat"));
-           return NULL;
-       }
-       boundint = yasm_intnum_get_uint(boundintn);
+    boundintn = yasm_expr_get_intnum(&boundval, NULL);
+    if (boundintn) {
+       unsigned long boundint = yasm_intnum_get_uint(boundintn);
 
        /* Alignments must be a power of two. */
-       if ((boundint & (boundint - 1)) != 0) {
-           yasm__error(cur_line,
-                       N_("section alignment is not a power of two"));
-           return NULL;
+       if ((boundint & (boundint - 1)) == 0) {
+           yasm_objfmt_section_align(parser_gas->objfmt,
+                                     parser_gas->cur_section, boundint,
+                                     cur_line);
        }
-
-       yasm_objfmt_section_align(parser_gas->objfmt, parser_gas->cur_section,
-                                 boundint, cur_line);
-       return NULL;
     }
 
     return yasm_bc_create_align(boundval, fillval, maxskipval,
index a0a71fd727ec2cc3800926a99ee191f1902abdb8..8afb9678f91e6f23020883b81a0882ce14581271 100644 (file)
@@ -93,8 +93,6 @@
 01 
 00 
 00 
-00 
-00 
 23 
 20 
 3a 
 00 
 00 
 00 
+00 
+00 
 2e 
 74 
 65 
@@ -686,7 +686,7 @@ d8
 00 
 00 
 00 
-60 
+5e 
 00 
 00 
 00 
@@ -702,7 +702,7 @@ d8
 00 
 00 
 00 
-04 
+00 
 00 
 00 
 00 
index b11bffeef02da6ffe5a09d9fcf15f28f2a862655..6539d4ccb14ccf4e4b33efedf2b5b684dd34b65f 100644 (file)
@@ -1,6 +1,7 @@
 .text
 .align 8
 .data
+.align 8
 .align 16
 .bss
 .align 32
index 2740266d9a4ad7e4b8c960d48f9496dd7046c7b8..f46f2cdf9bccbdc442117b310719f96c1312c8a8 100644 (file)
@@ -366,7 +366,7 @@ ff
 00 
 00 
 00 
-38 
+40 
 00 
 00 
 00 
@@ -382,7 +382,7 @@ ff
 00 
 00 
 00 
-08 
+10 
 00 
 00 
 00