]> granicus.if.org Git - yasm/commitdiff
Fixed handling of absolute sections in the elf object format, including
authorMichael Urman <mu@tortall.net>
Fri, 28 May 2004 13:19:48 +0000 (13:19 -0000)
committerMichael Urman <mu@tortall.net>
Fri, 28 May 2004 13:19:48 +0000 (13:19 -0000)
preventing a segfault.  The assumptions it had made for all sections
were wrong with absolute sections, so added just as much special casing
as necessary.  I hope the output is correct as well - this way we should
at least get bugs if it's wrong.

Reported by: Ben Skeggs <d4rk74m4@intas.net.au>

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

modules/objfmts/Makefile.inc
modules/objfmts/elf/elf-objfmt.c
modules/objfmts/elf/elf.c
modules/objfmts/elf/tests/Makefile.inc
modules/objfmts/elf/tests/elfabssect.asm [new file with mode: 0644]
modules/objfmts/elf/tests/elfabssect.errwarn [new file with mode: 0644]
modules/objfmts/elf/tests/elfabssect.hex [new file with mode: 0644]

index fc1896f8cf5a98016555afc1fb963ec8d72e81a9..b23b8c42d9f29536280c79b4aa9c773d6ba5c4d4 100644 (file)
@@ -3,11 +3,13 @@
 EXTRA_DIST += modules/objfmts/dbg/Makefile.inc
 EXTRA_DIST += modules/objfmts/bin/Makefile.inc
 EXTRA_DIST += modules/objfmts/elf/Makefile.inc
+#!EXTRA_DIST += modules/objfmts/omf/Makefile.inc
 EXTRA_DIST += modules/objfmts/coff/Makefile.inc
 EXTRA_DIST += modules/objfmts/win32/Makefile.inc
 
 include modules/objfmts/dbg/Makefile.inc
 include modules/objfmts/bin/Makefile.inc
 include modules/objfmts/elf/Makefile.inc
+#!include modules/objfmts/omf/Makefile.inc
 include modules/objfmts/coff/Makefile.inc
 include modules/objfmts/win32/Makefile.inc
index e83a6039f9ddb519e5d61ec30f2c9da7417e0836..eac4b8fb213e1f8144e91eac42a813037aca7632 100644 (file)
@@ -114,8 +114,9 @@ elf_objfmt_append_local_sym(yasm_symrec *sym, /*@null@*/ void *d)
        if (!yasm_symrec_get_label(sym, &precbc))
            return 1;
        sect = yasm_bc_get_section(precbc);
-       is_sect = strcmp(yasm_symrec_get_name(sym),
-                        yasm_section_get_name(sect))==0;
+       if (!yasm_section_is_absolute(sect) &&
+           strcmp(yasm_symrec_get_name(sym), yasm_section_get_name(sect))==0)
+           is_sect = 1;
 
        /* neither sections nor locals (except when debugging) need names */
        entry = elf_symtab_insert_local_sym(info->objfmt_elf->elf_symtab,
index b2c590880dfec61b9894128b18395347384590e0..c45f173da312812fa88e23caceced24f9fc31576 100644 (file)
@@ -489,14 +489,18 @@ elf_symtab_write_to_file(FILE *f, elf_symtab_head *symtab)
                YASM_WRITE_8(bufp, ELF32_ST_INFO(entry->bind, entry->type));
                YASM_WRITE_8(bufp, 0);
                if (entry->sect) {
-                   elf_secthead *shead =
-                       yasm_section_get_data(entry->sect, &elf_section_data);
-                   if (!shead)
-                       yasm_internal_error(
-                           N_("symbol references section without data"));
-                   YASM_WRITE_16_L(bufp, shead->index);
+                    if (yasm_section_is_absolute(entry->sect)) {
+                        YASM_WRITE_16_L(bufp, SHN_ABS);
+                    } else {
+                        elf_secthead *shead = yasm_section_get_data(entry->sect,
+                            &elf_section_data);
+                        if (!shead)
+                            yasm_internal_error(
+                                N_("symbol references section without data"));
+                        YASM_WRITE_16_L(bufp, shead->index);
+                    }
                } else {
-                   YASM_WRITE_16_L(bufp, entry->index);
+                    YASM_WRITE_16_L(bufp, entry->index);
                }
                fwrite(buf, SYMTAB32_SIZE, 1, f);
                size += SYMTAB32_SIZE;
@@ -507,12 +511,16 @@ elf_symtab_write_to_file(FILE *f, elf_symtab_head *symtab)
                YASM_WRITE_8(bufp, ELF64_ST_INFO(entry->bind, entry->type));
                YASM_WRITE_8(bufp, 0);
                if (entry->sect) {
-                   elf_secthead *shead =
-                       yasm_section_get_data(entry->sect, &elf_section_data);
-                   if (!shead)
-                       yasm_internal_error(
-                           N_("symbol references section without data"));
-                   YASM_WRITE_16_L(bufp, shead->index);
+                    if (yasm_section_is_absolute(entry->sect)) {
+                        YASM_WRITE_16_L(bufp, SHN_ABS);
+                    } else {
+                        elf_secthead *shead = yasm_section_get_data(entry->sect,
+                            &elf_section_data);
+                        if (!shead)
+                            yasm_internal_error(
+                                N_("symbol references section without data"));
+                        YASM_WRITE_16_L(bufp, shead->index);
+                    }
                } else {
                    YASM_WRITE_16_L(bufp, entry->index);
                }
index 3dd0ec9517fb863b6537909c6e1fe4eacdc5a054..1087e295cbda9b44c601da96f007ec5e476a4a3d 100644 (file)
@@ -27,6 +27,9 @@ EXTRA_DIST += modules/objfmts/elf/tests/elfglobext.errwarn
 EXTRA_DIST += modules/objfmts/elf/tests/elfglobext.hex
 EXTRA_DIST += modules/objfmts/elf/tests/elfreloc-err.asm
 EXTRA_DIST += modules/objfmts/elf/tests/elfreloc-err.errwarn
+EXTRA_DIST += modules/objfmts/elf/tests/elfabssect.asm
+EXTRA_DIST += modules/objfmts/elf/tests/elfabssect.errwarn
+EXTRA_DIST += modules/objfmts/elf/tests/elfabssect.hex
 
 EXTRA_DIST += modules/objfmts/elf/tests/amd64/Makefile.inc
 
diff --git a/modules/objfmts/elf/tests/elfabssect.asm b/modules/objfmts/elf/tests/elfabssect.asm
new file mode 100644 (file)
index 0000000..cf0cb3b
--- /dev/null
@@ -0,0 +1,9 @@
+%line 1+1 elfabssect.asm
+[absolute 0]
+%line 1+0 elfabssect.asm
+teststruc:
+%line 2+1 elfabssect.asm
+ .testlabel resw 1
+teststruc_size:
+%line 3+0 elfabssect.asm
+[section .text]
diff --git a/modules/objfmts/elf/tests/elfabssect.errwarn b/modules/objfmts/elf/tests/elfabssect.errwarn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/modules/objfmts/elf/tests/elfabssect.hex b/modules/objfmts/elf/tests/elfabssect.hex
new file mode 100644 (file)
index 0000000..bff75aa
--- /dev/null
@@ -0,0 +1,392 @@
+7f 
+45 
+4c 
+46 
+01 
+01 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+01 
+00 
+03 
+00 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+c0 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+34 
+00 
+00 
+00 
+00 
+00 
+28 
+00 
+05 
+00 
+01 
+00 
+00 
+2e 
+74 
+65 
+78 
+74 
+00 
+2e 
+73 
+74 
+72 
+74 
+61 
+62 
+00 
+2e 
+73 
+79 
+6d 
+74 
+61 
+62 
+00 
+2e 
+73 
+68 
+73 
+74 
+72 
+74 
+61 
+62 
+00 
+00 
+00 
+00 
+00 
+2d 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+01 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+04 
+00 
+f1 
+ff 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+f1 
+ff 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+f1 
+ff 
+00 
+00 
+00 
+00 
+02 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+f1 
+ff 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+17 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+34 
+00 
+00 
+00 
+21 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+07 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+58 
+00 
+00 
+00 
+03 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+0f 
+00 
+00 
+00 
+02 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+5c 
+00 
+00 
+00 
+60 
+00 
+00 
+00 
+02 
+00 
+00 
+00 
+06 
+00 
+00 
+00 
+04 
+00 
+00 
+00 
+10 
+00 
+00 
+00 
+01 
+00 
+00 
+00 
+01 
+00 
+00 
+00 
+06 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+00 
+10 
+00 
+00 
+00 
+00 
+00 
+00 
+00