6d43b86da1dcbea5ec72b0cd754d934ac50a5a3e
[platform/upstream/nasm.git] / output / outelf.c
1 /* ----------------------------------------------------------------------- *
2  *   
3  *   Copyright 1996-2010 The NASM Authors - All Rights Reserved
4  *   See the file AUTHORS included with the NASM distribution for
5  *   the specific copyright holders.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following
9  *   conditions are met:
10  *
11  *   * Redistributions of source code must retain the above copyright
12  *     notice, this list of conditions and the following disclaimer.
13  *   * Redistributions in binary form must reproduce the above
14  *     copyright notice, this list of conditions and the following
15  *     disclaimer in the documentation and/or other materials provided
16  *     with the distribution.
17  *     
18  *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19  *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23  *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * ----------------------------------------------------------------------- */
33
34 /*
35  * Common code for outelf32 and outelf64
36  */
37
38 #include "compiler.h"
39
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <inttypes.h>
43
44 #include "nasm.h"
45 #include "output/outform.h"
46
47 #include "output/dwarf.h"
48 #include "output/elf.h"
49 #include "output/outelf.h"
50
51 #if defined(OF_ELF32) || defined(OF_ELF64)
52
53 const struct elf_known_section elf_known_sections[] = {
54     { ".text",    SHT_PROGBITS, SHF_ALLOC|SHF_EXECINSTR,     16 },
55     { ".rodata",  SHT_PROGBITS, SHF_ALLOC,                    4 },
56     { ".lrodata", SHT_PROGBITS, SHF_ALLOC,                    4 },
57     { ".data",    SHT_PROGBITS, SHF_ALLOC|SHF_WRITE,          4 },
58     { ".ldata",   SHT_PROGBITS, SHF_ALLOC|SHF_WRITE,          4 },
59     { ".bss",     SHT_NOBITS,   SHF_ALLOC|SHF_WRITE,          4 },
60     { ".lbss",    SHT_NOBITS,   SHF_ALLOC|SHF_WRITE,          4 },
61     { ".tdata",   SHT_PROGBITS, SHF_ALLOC|SHF_WRITE|SHF_TLS,  4 },
62     { ".tbss",    SHT_NOBITS,   SHF_ALLOC|SHF_WRITE|SHF_TLS,  4 },
63     { ".comment", SHT_PROGBITS, 0,                            1 },
64     { NULL,       SHT_PROGBITS, SHF_ALLOC,                    1 } /* default */
65 };
66
67 /* parse section attributes */
68 void section_attrib(char *name, char *attr, int pass,
69                     uint32_t *flags_and, uint32_t *flags_or,
70                     uint64_t *align, int *type)
71 {
72     char *opt, *val, *next;
73
74     opt = nasm_skip_spaces(attr);
75     if (!opt || !*opt)
76         return;
77
78     while ((opt = nasm_opt_val(opt, &val, &next))) {
79         if (!nasm_stricmp(opt, "align")) {
80             *align = atoi(val);
81             if (*align == 0) {
82                 *align = SHA_ANY;
83             } else if (!is_power2(*align)) {
84                 nasm_error(ERR_NONFATAL,
85                            "section alignment %"PRId64" is not a power of two",
86                            *align);
87                 *align = SHA_ANY;
88             }
89         } else if (!nasm_stricmp(opt, "alloc")) {
90             *flags_and  |= SHF_ALLOC;
91             *flags_or   |= SHF_ALLOC;
92         } else if (!nasm_stricmp(opt, "noalloc")) {
93             *flags_and  |= SHF_ALLOC;
94             *flags_or   &= ~SHF_ALLOC;
95         } else if (!nasm_stricmp(opt, "exec")) {
96             *flags_and  |= SHF_EXECINSTR;
97             *flags_or   |= SHF_EXECINSTR;
98         } else if (!nasm_stricmp(opt, "noexec")) {
99             *flags_and  |= SHF_EXECINSTR;
100             *flags_or   &= ~SHF_EXECINSTR;
101         } else if (!nasm_stricmp(opt, "write")) {
102             *flags_and  |= SHF_WRITE;
103             *flags_or   |= SHF_WRITE;
104         } else if (!nasm_stricmp(opt, "tls")) {
105             *flags_and  |= SHF_TLS;
106             *flags_or   |= SHF_TLS;
107         } else if (!nasm_stricmp(opt, "nowrite")) {
108             *flags_and  |= SHF_WRITE;
109             *flags_or   &= ~SHF_WRITE;
110         } else if (!nasm_stricmp(opt, "progbits")) {
111             *type = SHT_PROGBITS;
112         } else if (!nasm_stricmp(opt, "nobits")) {
113             *type = SHT_NOBITS;
114         } else if (pass == 1) {
115             nasm_error(ERR_WARNING,
116                        "Unknown section attribute '%s' ignored on"
117                        " declaration of section `%s'", opt, name);
118         }
119         opt = next;
120     }
121 }
122
123 #endif /* defined(OF_ELF32) || defined(OF_ELF64) */