Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(419)

Side by Side Diff: third_party/yasm/patched-yasm/modules/objfmts/elf/elf-objfmt.c

Issue 6170009: Update our yasm copy to yasm 1.1.0 (Part 1: yasm side)... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/
Patch Set: Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * ELF object format 2 * ELF object format
3 * 3 *
4 * Copyright (C) 2003-2007 Michael Urman 4 * Copyright (C) 2003-2007 Michael Urman
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright 11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the 12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution. 13 * documentation and/or other materials provided with the distribution.
14 * 14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE. 25 * POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 #include <util.h> 27 #include <util.h>
28 /*@unused@*/ RCSID("$Id: elf-objfmt.c 2166 2009-01-02 08:33:21Z peter $"); 28 /*@unused@*/ RCSID("$Id: elf-objfmt.c 2310 2010-03-28 19:28:54Z peter $");
29 29
30 /* Notes 30 /* Notes
31 * 31 *
32 * elf-objfmt uses the "linking" view of an ELF file: 32 * elf-objfmt uses the "linking" view of an ELF file:
33 * ELF header, an optional program header table, several sections, 33 * ELF header, an optional program header table, several sections,
34 * and a section header table 34 * and a section header table
35 * 35 *
36 * The ELF header tells us some overall program information, 36 * The ELF header tells us some overall program information,
37 * where to find the PHT (if it exists) with phnum and phentsize, 37 * where to find the PHT (if it exists) with phnum and phentsize,
38 * and where to find the SHT with shnum and shentsize 38 * and where to find the SHT with shnum and shentsize
(...skipping 22 matching lines...) Expand all
61 } yasm_objfmt_elf; 61 } yasm_objfmt_elf;
62 62
63 typedef struct { 63 typedef struct {
64 yasm_objfmt_elf *objfmt_elf; 64 yasm_objfmt_elf *objfmt_elf;
65 yasm_errwarns *errwarns; 65 yasm_errwarns *errwarns;
66 FILE *f; 66 FILE *f;
67 elf_secthead *shead; 67 elf_secthead *shead;
68 yasm_section *sect; 68 yasm_section *sect;
69 yasm_object *object; 69 yasm_object *object;
70 unsigned long sindex; 70 unsigned long sindex;
71 yasm_symrec *GOT_sym;
71 } elf_objfmt_output_info; 72 } elf_objfmt_output_info;
72 73
73 typedef struct { 74 typedef struct {
74 yasm_object *object; 75 yasm_object *object;
75 yasm_objfmt_elf *objfmt_elf; 76 yasm_objfmt_elf *objfmt_elf;
76 yasm_errwarns *errwarns; 77 yasm_errwarns *errwarns;
77 int local_names; 78 int local_names;
78 } build_symtab_info; 79 } build_symtab_info;
79 80
80 yasm_objfmt_module yasm_elf_LTX_objfmt; 81 yasm_objfmt_module yasm_elf_LTX_objfmt;
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 elf_objfmt_output_reloc(yasm_symrec *sym, yasm_bytecode *bc, 448 elf_objfmt_output_reloc(yasm_symrec *sym, yasm_bytecode *bc,
448 unsigned char *buf, unsigned int destsize, 449 unsigned char *buf, unsigned int destsize,
449 unsigned int valsize, int warn, void *d) 450 unsigned int valsize, int warn, void *d)
450 { 451 {
451 elf_reloc_entry *reloc; 452 elf_reloc_entry *reloc;
452 elf_objfmt_output_info *info = d; 453 elf_objfmt_output_info *info = d;
453 yasm_intnum *zero; 454 yasm_intnum *zero;
454 int retval; 455 int retval;
455 456
456 reloc = elf_reloc_entry_create(sym, NULL, 457 reloc = elf_reloc_entry_create(sym, NULL,
457 yasm_intnum_create_uint(bc->offset), 0, valsize); 458 yasm_intnum_create_uint(bc->offset), 0, valsize, 0);
458 if (reloc == NULL) { 459 if (reloc == NULL) {
459 yasm_error_set(YASM_ERROR_TYPE, N_("elf: invalid relocation size")); 460 yasm_error_set(YASM_ERROR_TYPE, N_("elf: invalid relocation size"));
460 return 1; 461 return 1;
461 } 462 }
462 /* allocate .rel[a] sections on a need-basis */ 463 /* allocate .rel[a] sections on a need-basis */
463 elf_secthead_append_reloc(info->sect, info->shead, reloc); 464 elf_secthead_append_reloc(info->sect, info->shead, reloc);
464 465
465 zero = yasm_intnum_create_uint(0); 466 zero = yasm_intnum_create_uint(0);
466 elf_handle_reloc_addend(zero, reloc); 467 elf_handle_reloc_addend(zero, reloc, 0);
467 retval = yasm_arch_intnum_tobytes(info->object->arch, zero, buf, destsize, 468 retval = yasm_arch_intnum_tobytes(info->object->arch, zero, buf, destsize,
468 valsize, 0, bc, warn); 469 valsize, 0, bc, warn);
469 yasm_intnum_destroy(zero); 470 yasm_intnum_destroy(zero);
470 return retval; 471 return retval;
471 } 472 }
472 473
473 static int 474 static int
474 elf_objfmt_output_value(yasm_value *value, unsigned char *buf, 475 elf_objfmt_output_value(yasm_value *value, unsigned char *buf,
475 unsigned int destsize, unsigned long offset, 476 unsigned int destsize, unsigned long offset,
476 yasm_bytecode *bc, int warn, /*@null@*/ void *d) 477 yasm_bytecode *bc, int warn, /*@null@*/ void *d)
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 sym = elf_secthead_get_sym(sym_shead); 540 sym = elf_secthead_get_sym(sym_shead);
540 541
541 intn_val = yasm_bc_next_offset(sym_precbc); 542 intn_val = yasm_bc_next_offset(sym_precbc);
542 } 543 }
543 } 544 }
544 545
545 /* For PC-relative, need to add offset of expression within bc. */ 546 /* For PC-relative, need to add offset of expression within bc. */
546 if (value->curpos_rel) 547 if (value->curpos_rel)
547 intn_val += offset; 548 intn_val += offset;
548 549
550 /* Check for _GLOBAL_OFFSET_TABLE_ symbol reference */
549 reloc = elf_reloc_entry_create(sym, wrt, 551 reloc = elf_reloc_entry_create(sym, wrt,
550 yasm_intnum_create_uint(bc->offset + offset), value->curpos_rel, 552 yasm_intnum_create_uint(bc->offset + offset), value->curpos_rel,
551 valsize); 553 valsize, sym == info->GOT_sym);
552 if (reloc == NULL) { 554 if (reloc == NULL) {
553 yasm_error_set(YASM_ERROR_TYPE, 555 yasm_error_set(YASM_ERROR_TYPE,
554 N_("elf: invalid relocation (WRT or size)")); 556 N_("elf: invalid relocation (WRT or size)"));
555 return 1; 557 return 1;
556 } 558 }
557 /* allocate .rel[a] sections on a need-basis */ 559 /* allocate .rel[a] sections on a need-basis */
558 elf_secthead_append_reloc(info->sect, info->shead, reloc); 560 elf_secthead_append_reloc(info->sect, info->shead, reloc);
559 } 561 }
560 562
561 intn = yasm_intnum_create_uint(intn_val); 563 intn = yasm_intnum_create_uint(intn_val);
562 564
563 if (value->abs) { 565 if (value->abs) {
564 yasm_intnum *intn2 = yasm_expr_get_intnum(&value->abs, 0); 566 yasm_intnum *intn2 = yasm_expr_get_intnum(&value->abs, 0);
565 if (!intn2) { 567 if (!intn2) {
566 yasm_error_set(YASM_ERROR_TOO_COMPLEX, 568 yasm_error_set(YASM_ERROR_TOO_COMPLEX,
567 N_("elf: relocation too complex")); 569 N_("elf: relocation too complex"));
568 yasm_intnum_destroy(intn); 570 yasm_intnum_destroy(intn);
569 return 1; 571 return 1;
570 } 572 }
571 yasm_intnum_calc(intn, YASM_EXPR_ADD, intn2); 573 yasm_intnum_calc(intn, YASM_EXPR_ADD, intn2);
572 } 574 }
573 575
574 if (reloc) 576 if (reloc)
575 elf_handle_reloc_addend(intn, reloc); 577 elf_handle_reloc_addend(intn, reloc, offset);
576 retval = yasm_arch_intnum_tobytes(info->object->arch, intn, buf, destsize, 578 retval = yasm_arch_intnum_tobytes(info->object->arch, intn, buf, destsize,
577 valsize, 0, bc, warn); 579 valsize, 0, bc, warn);
578 yasm_intnum_destroy(intn); 580 yasm_intnum_destroy(intn);
579 return retval; 581 return retval;
580 } 582 }
581 583
582 static int 584 static int
583 elf_objfmt_output_bytecode(yasm_bytecode *bc, /*@null@*/ void *d) 585 elf_objfmt_output_bytecode(yasm_bytecode *bc, /*@null@*/ void *d)
584 { 586 {
585 /*@null@*/ elf_objfmt_output_info *info = (elf_objfmt_output_info *)d; 587 /*@null@*/ elf_objfmt_output_info *info = (elf_objfmt_output_info *)d;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 } 627 }
626 628
627 /* If bigbuf was allocated, free it */ 629 /* If bigbuf was allocated, free it */
628 if (bigbuf) 630 if (bigbuf)
629 yasm_xfree(bigbuf); 631 yasm_xfree(bigbuf);
630 632
631 return 0; 633 return 0;
632 } 634 }
633 635
634 static int 636 static int
635 elf_objfmt_create_dbg_secthead(yasm_section *sect, /*@null@*/ void *d)
636 {
637 /*@null@*/ elf_objfmt_output_info *info = (elf_objfmt_output_info *)d;
638 elf_secthead *shead;
639 elf_section_type type=SHT_PROGBITS;
640 elf_size entsize=0;
641 const char *sectname;
642 /*@dependent@*/ yasm_symrec *sym;
643 elf_strtab_entry *name;
644
645 shead = yasm_section_get_data(sect, &elf_section_data);
646 if (shead)
647 return 0; /* only create new secthead if missing */
648
649 sectname = yasm_section_get_name(sect);
650 name = elf_strtab_append_str(info->objfmt_elf->shstrtab, sectname);
651
652 if (yasm__strcasecmp(sectname, ".stab")==0) {
653 entsize = 12;
654 } else if (yasm__strcasecmp(sectname, ".stabstr")==0) {
655 type = SHT_STRTAB;
656 } else if (yasm__strncasecmp(sectname, ".debug_", 7)==0) {
657 ;
658 } else
659 yasm_internal_error(N_("Unrecognized section without data"));
660
661 shead = elf_secthead_create(name, type, 0, 0, 0);
662 elf_secthead_set_entsize(shead, entsize);
663
664 sym = yasm_symtab_define_label(info->object->symtab, sectname,
665 yasm_section_bcs_first(sect), 1, 0);
666 elf_secthead_set_sym(shead, sym);
667
668 yasm_section_add_data(sect, &elf_section_data, shead);
669
670 return 0;
671 }
672
673 static int
674 elf_objfmt_output_section(yasm_section *sect, /*@null@*/ void *d) 637 elf_objfmt_output_section(yasm_section *sect, /*@null@*/ void *d)
675 { 638 {
676 /*@null@*/ elf_objfmt_output_info *info = (elf_objfmt_output_info *)d; 639 /*@null@*/ elf_objfmt_output_info *info = (elf_objfmt_output_info *)d;
677 /*@dependent@*/ /*@null@*/ elf_secthead *shead; 640 /*@dependent@*/ /*@null@*/ elf_secthead *shead;
678 long pos; 641 long pos;
679 char *relname; 642 char *relname;
680 const char *sectname; 643 const char *sectname;
681 644
682 if (info == NULL) 645 if (info == NULL)
683 yasm_internal_error("null info struct"); 646 yasm_internal_error("null info struct");
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 elf_secthead *esdn; 736 elf_secthead *esdn;
774 unsigned long elf_strtab_offset, elf_shstrtab_offset, elf_symtab_offset; 737 unsigned long elf_strtab_offset, elf_shstrtab_offset, elf_symtab_offset;
775 unsigned long elf_strtab_size, elf_shstrtab_size, elf_symtab_size; 738 unsigned long elf_strtab_size, elf_shstrtab_size, elf_symtab_size;
776 elf_strtab_entry *elf_strtab_name, *elf_shstrtab_name, *elf_symtab_name; 739 elf_strtab_entry *elf_strtab_name, *elf_shstrtab_name, *elf_symtab_name;
777 unsigned long elf_symtab_nlocal; 740 unsigned long elf_symtab_nlocal;
778 741
779 info.object = object; 742 info.object = object;
780 info.objfmt_elf = objfmt_elf; 743 info.objfmt_elf = objfmt_elf;
781 info.errwarns = errwarns; 744 info.errwarns = errwarns;
782 info.f = f; 745 info.f = f;
746 info.GOT_sym = yasm_symtab_get(object->symtab, "_GLOBAL_OFFSET_TABLE_");
783 747
784 /* Update filename strtab */ 748 /* Update filename strtab */
785 elf_strtab_entry_set_str(objfmt_elf->file_strtab_entry, 749 elf_strtab_entry_set_str(objfmt_elf->file_strtab_entry,
786 object->src_filename); 750 object->src_filename);
787 751
788 /* Allocate space for Ehdr by seeking forward */ 752 /* Allocate space for Ehdr by seeking forward */
789 if (fseek(f, (long)(elf_proghead_get_size()), SEEK_SET) < 0) { 753 if (fseek(f, (long)(elf_proghead_get_size()), SEEK_SET) < 0) {
790 yasm_error_set(YASM_ERROR_IO, N_("could not seek on output file")); 754 yasm_error_set(YASM_ERROR_IO, N_("could not seek on output file"));
791 yasm_errwarn_propagate(errwarns, 0); 755 yasm_errwarn_propagate(errwarns, 0);
792 return; 756 return;
793 } 757 }
794 758
795 /* Create missing section headers */
796 if (yasm_object_sections_traverse(object, &info,
797 elf_objfmt_create_dbg_secthead))
798 return;
799
800 /* add all (local) syms to symtab because relocation needs a symtab index 759 /* add all (local) syms to symtab because relocation needs a symtab index
801 * if all_syms, register them by name. if not, use strtab entry 0 */ 760 * if all_syms, register them by name. if not, use strtab entry 0 */
802 buildsym_info.object = object; 761 buildsym_info.object = object;
803 buildsym_info.objfmt_elf = objfmt_elf; 762 buildsym_info.objfmt_elf = objfmt_elf;
804 buildsym_info.errwarns = errwarns; 763 buildsym_info.errwarns = errwarns;
805 buildsym_info.local_names = all_syms; 764 buildsym_info.local_names = all_syms;
806 yasm_symtab_traverse(object->symtab, &buildsym_info, 765 yasm_symtab_traverse(object->symtab, &buildsym_info,
807 elf_objfmt_build_symtab); 766 elf_objfmt_build_symtab);
808 elf_symtab_nlocal = elf_symtab_assign_indices(objfmt_elf->elf_symtab); 767 elf_symtab_nlocal = elf_symtab_assign_indices(objfmt_elf->elf_symtab);
809 768
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 static void 874 static void
916 elf_objfmt_destroy(yasm_objfmt *objfmt) 875 elf_objfmt_destroy(yasm_objfmt *objfmt)
917 { 876 {
918 yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)objfmt; 877 yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)objfmt;
919 elf_symtab_destroy(objfmt_elf->elf_symtab); 878 elf_symtab_destroy(objfmt_elf->elf_symtab);
920 elf_strtab_destroy(objfmt_elf->shstrtab); 879 elf_strtab_destroy(objfmt_elf->shstrtab);
921 elf_strtab_destroy(objfmt_elf->strtab); 880 elf_strtab_destroy(objfmt_elf->strtab);
922 yasm_xfree(objfmt); 881 yasm_xfree(objfmt);
923 } 882 }
924 883
925 static elf_secthead * 884 static void
926 elf_objfmt_init_new_section(yasm_object *object, yasm_section *sect, 885 elf_objfmt_init_new_section(yasm_section *sect, unsigned long line)
927 const char *sectname, unsigned long type,
928 unsigned long flags, unsigned long line)
929 { 886 {
887 yasm_object *object = yasm_section_get_object(sect);
888 const char *sectname = yasm_section_get_name(sect);
930 yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt; 889 yasm_objfmt_elf *objfmt_elf = (yasm_objfmt_elf *)object->objfmt;
931 elf_secthead *esd; 890 elf_secthead *esd;
932 yasm_symrec *sym; 891 yasm_symrec *sym;
933 elf_strtab_entry *name = elf_strtab_append_str(objfmt_elf->shstrtab, 892 elf_strtab_entry *name = elf_strtab_append_str(objfmt_elf->shstrtab,
934 sectname); 893 sectname);
935 894
936 esd = elf_secthead_create(name, type, flags, 0, 0); 895 elf_section_type type=SHT_PROGBITS;
896 elf_size entsize=0;
897
898 if (yasm__strcasecmp(sectname, ".stab")==0) {
899 entsize = 12;
900 } else if (yasm__strcasecmp(sectname, ".stabstr")==0) {
901 type = SHT_STRTAB;
902 }
903
904 esd = elf_secthead_create(name, type, 0, 0, 0);
905 elf_secthead_set_entsize(esd, entsize);
937 yasm_section_add_data(sect, &elf_section_data, esd); 906 yasm_section_add_data(sect, &elf_section_data, esd);
938 sym = yasm_symtab_define_label(object->symtab, sectname, 907 sym = yasm_symtab_define_label(object->symtab, sectname,
939 yasm_section_bcs_first(sect), 1, line); 908 yasm_section_bcs_first(sect), 1, line);
940 909
941 elf_secthead_set_sym(esd, sym); 910 elf_secthead_set_sym(esd, sym);
942
943 return esd;
944 } 911 }
945 912
946 static yasm_section * 913 static yasm_section *
947 elf_objfmt_add_default_section(yasm_object *object) 914 elf_objfmt_add_default_section(yasm_object *object)
948 { 915 {
949 yasm_section *retval; 916 yasm_section *retval;
950 int isnew; 917 int isnew;
951 elf_secthead *esd;
952 918
953 retval = yasm_object_get_general(object, ".text", 16, 1, 0, &isnew, 0); 919 retval = yasm_object_get_general(object, ".text", 16, 1, 0, &isnew, 0);
954 esd = elf_objfmt_init_new_section(object, retval, ".text", SHT_PROGBITS, 920 if (isnew)
955 SHF_ALLOC + SHF_EXECINSTR, 0); 921 {
956 yasm_section_set_default(retval, 1); 922 elf_secthead *esd = yasm_section_get_data(retval, &elf_section_data);
923 elf_secthead_set_typeflags(esd, SHT_PROGBITS,
924 SHF_ALLOC + SHF_EXECINSTR);
925 yasm_section_set_default(retval, 1);
926 }
957 return retval; 927 return retval;
958 } 928 }
959 929
960 struct elf_section_switch_data { 930 struct elf_section_switch_data {
961 /*@only@*/ /*@null@*/ yasm_intnum *align_intn; 931 /*@only@*/ /*@null@*/ yasm_intnum *align_intn;
962 unsigned long flags; 932 unsigned long flags;
963 unsigned long type; 933 unsigned long type;
964 int gasflags; 934 int gasflags;
965 int stdsect; 935 int stdsect;
966 }; 936 };
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1135 yasm_warn_set(YASM_WARN_GENERAL, 1105 yasm_warn_set(YASM_WARN_GENERAL,
1136 N_("entity size for SHF_MERGE not specified")); 1106 N_("entity size for SHF_MERGE not specified"));
1137 data.flags &= ~SHF_MERGE; 1107 data.flags &= ~SHF_MERGE;
1138 } 1108 }
1139 } 1109 }
1140 1110
1141 retval = yasm_object_get_general(object, sectname, align, 1111 retval = yasm_object_get_general(object, sectname, align,
1142 (data.flags & SHF_EXECINSTR) != 0, 1112 (data.flags & SHF_EXECINSTR) != 0,
1143 resonly, &isnew, line); 1113 resonly, &isnew, line);
1144 1114
1145 if (isnew) 1115 esd = yasm_section_get_data(retval, &elf_section_data);
1146 esd = elf_objfmt_init_new_section(object, retval, sectname, data.type,
1147 data.flags, line);
1148 else
1149 esd = yasm_section_get_data(retval, &elf_section_data);
1150 1116
1151 if (isnew || yasm_section_is_default(retval)) { 1117 if (isnew || yasm_section_is_default(retval)) {
1152 yasm_section_set_default(retval, 0); 1118 yasm_section_set_default(retval, 0);
1153 elf_secthead_set_typeflags(esd, data.type, data.flags); 1119 elf_secthead_set_typeflags(esd, data.type, data.flags);
1154 if (merge_intn) 1120 if (merge_intn)
1155 elf_secthead_set_entsize(esd, yasm_intnum_get_uint(merge_intn)); 1121 elf_secthead_set_entsize(esd, yasm_intnum_get_uint(merge_intn));
1156 yasm_section_set_align(retval, align, line); 1122 yasm_section_set_align(retval, align, line);
1157 } else if (flags_override && !data.gasflags) 1123 } else if (flags_override && !data.gasflags)
1158 yasm_warn_set(YASM_WARN_GENERAL, 1124 yasm_warn_set(YASM_WARN_GENERAL,
1159 N_("section flags ignored on section redeclaration")); 1125 N_("section flags ignored on section redeclaration"));
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1349 32, 1315 32,
1350 0, 1316 0,
1351 elf_objfmt_dbgfmt_keywords, 1317 elf_objfmt_dbgfmt_keywords,
1352 "null", 1318 "null",
1353 elf_objfmt_directives, 1319 elf_objfmt_directives,
1354 elf_objfmt_stdmacs, 1320 elf_objfmt_stdmacs,
1355 elf_objfmt_create, 1321 elf_objfmt_create,
1356 elf_objfmt_output, 1322 elf_objfmt_output,
1357 elf_objfmt_destroy, 1323 elf_objfmt_destroy,
1358 elf_objfmt_add_default_section, 1324 elf_objfmt_add_default_section,
1325 elf_objfmt_init_new_section,
1359 elf_objfmt_section_switch, 1326 elf_objfmt_section_switch,
1360 elf_objfmt_get_special_sym 1327 elf_objfmt_get_special_sym
1361 }; 1328 };
1362 1329
1363 yasm_objfmt_module yasm_elf32_LTX_objfmt = { 1330 yasm_objfmt_module yasm_elf32_LTX_objfmt = {
1364 "ELF (32-bit)", 1331 "ELF (32-bit)",
1365 "elf32", 1332 "elf32",
1366 "o", 1333 "o",
1367 32, 1334 32,
1368 0, 1335 0,
1369 elf_objfmt_dbgfmt_keywords, 1336 elf_objfmt_dbgfmt_keywords,
1370 "null", 1337 "null",
1371 elf_objfmt_directives, 1338 elf_objfmt_directives,
1372 elf_objfmt_stdmacs, 1339 elf_objfmt_stdmacs,
1373 elf32_objfmt_create, 1340 elf32_objfmt_create,
1374 elf_objfmt_output, 1341 elf_objfmt_output,
1375 elf_objfmt_destroy, 1342 elf_objfmt_destroy,
1376 elf_objfmt_add_default_section, 1343 elf_objfmt_add_default_section,
1344 elf_objfmt_init_new_section,
1377 elf_objfmt_section_switch, 1345 elf_objfmt_section_switch,
1378 elf_objfmt_get_special_sym 1346 elf_objfmt_get_special_sym
1379 }; 1347 };
1380 1348
1381 yasm_objfmt_module yasm_elf64_LTX_objfmt = { 1349 yasm_objfmt_module yasm_elf64_LTX_objfmt = {
1382 "ELF (64-bit)", 1350 "ELF (64-bit)",
1383 "elf64", 1351 "elf64",
1384 "o", 1352 "o",
1385 64, 1353 64,
1386 0, 1354 0,
1387 elf_objfmt_dbgfmt_keywords, 1355 elf_objfmt_dbgfmt_keywords,
1388 "null", 1356 "null",
1389 elf_objfmt_directives, 1357 elf_objfmt_directives,
1390 elf_objfmt_stdmacs, 1358 elf_objfmt_stdmacs,
1391 elf64_objfmt_create, 1359 elf64_objfmt_create,
1392 elf_objfmt_output, 1360 elf_objfmt_output,
1393 elf_objfmt_destroy, 1361 elf_objfmt_destroy,
1394 elf_objfmt_add_default_section, 1362 elf_objfmt_add_default_section,
1363 elf_objfmt_init_new_section,
1395 elf_objfmt_section_switch, 1364 elf_objfmt_section_switch,
1396 elf_objfmt_get_special_sym 1365 elf_objfmt_get_special_sym
1397 }; 1366 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698