Annotation of /trunk/nasm/patches/nasm-0.98.39-visibility.patch
Parent Directory | Revision Log
Revision 153 -
(hide annotations)
(download)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 4219 byte(s)
Tue May 8 20:52:56 2007 UTC (17 years, 4 months ago) by niro
File size: 4219 byte(s)
-import
1 | niro | 153 | Add support for declaring elf visibility attributes. Used to |
2 | help cleanup TEXTRELs in misc libraries (like libsdl). | ||
3 | |||
4 | Syntax to declare function foo hidden: | ||
5 | GLOBAL foo:function hidden | ||
6 | |||
7 | Patch by Mike Frysinger <vapier@gentoo.org> | ||
8 | |||
9 | http://sourceforge.net/mailarchive/forum.php?thread_id=9230919&forum_id=4978 | ||
10 | |||
11 | --- nasm/output/outelf.c | ||
12 | +++ nasm/output/outelf.c | ||
13 | @@ -50,6 +50,7 @@ struct Symbol { | ||
14 | long strpos; /* string table position of name */ | ||
15 | long section; /* section ID of the symbol */ | ||
16 | int type; /* symbol type */ | ||
17 | + int other; /* symbol visibility */ | ||
18 | long value; /* address, or COMMON variable align */ | ||
19 | long size; /* size of symbol */ | ||
20 | long globnum; /* symbol table offset if global */ | ||
21 | @@ -113,9 +114,15 @@ extern struct ofmt of_elf; | ||
22 | |||
23 | #define SYM_SECTION 0x04 | ||
24 | #define SYM_GLOBAL 0x10 | ||
25 | +#define SYM_NOTYPE 0x00 | ||
26 | #define SYM_DATA 0x01 | ||
27 | #define SYM_FUNCTION 0x02 | ||
28 | |||
29 | +#define STV_DEFAULT 0 | ||
30 | +#define STV_INTERNAL 1 | ||
31 | +#define STV_HIDDEN 2 | ||
32 | +#define STV_PROTECTED 3 | ||
33 | + | ||
34 | #define GLOBAL_TEMP_BASE 16 /* bigger than any constant sym id */ | ||
35 | |||
36 | #define SEG_ALIGN 16 /* alignment of sections in file */ | ||
37 | @@ -493,6 +500,7 @@ static void elf_deflabel(char *name, lon | ||
38 | |||
39 | sym->strpos = pos; | ||
40 | sym->type = is_global ? SYM_GLOBAL : 0; | ||
41 | + sym->other = STV_DEFAULT; | ||
42 | sym->size = 0; | ||
43 | if (segment == NO_SEG) | ||
44 | sym->section = SHN_ABS; | ||
45 | @@ -570,18 +578,39 @@ static void elf_deflabel(char *name, lon | ||
46 | sym->next = sects[sym->section - 1]->gsyms; | ||
47 | sects[sym->section - 1]->gsyms = sym; | ||
48 | |||
49 | + /* ELF syntax: GLOBAL name[:type [visibility]] */ | ||
50 | if (special) { | ||
51 | - int n = strcspn(special, " "); | ||
52 | - | ||
53 | + int n = strcspn(special, " \t"); | ||
54 | if (!nasm_strnicmp(special, "function", n)) | ||
55 | sym->type |= SYM_FUNCTION; | ||
56 | else if (!nasm_strnicmp(special, "data", n) || | ||
57 | !nasm_strnicmp(special, "object", n)) | ||
58 | sym->type |= SYM_DATA; | ||
59 | + else if (!nasm_strnicmp(special, "notype", n)) | ||
60 | + sym->type |= SYM_NOTYPE; | ||
61 | else | ||
62 | error(ERR_NONFATAL, "unrecognised symbol type `%.*s'", | ||
63 | n, special); | ||
64 | + special += n; | ||
65 | + | ||
66 | + while (isspace(*special)) | ||
67 | + ++special; | ||
68 | + if (*special) { | ||
69 | + n = strcspn(special, " \t"); | ||
70 | + if (!nasm_strnicmp(special, "default", n)) | ||
71 | + sym->other = STV_DEFAULT; | ||
72 | + else if (!nasm_strnicmp(special, "internal", n)) | ||
73 | + sym->other = STV_INTERNAL; | ||
74 | + else if (!nasm_strnicmp(special, "hidden", n)) | ||
75 | + sym->other = STV_HIDDEN; | ||
76 | + else if (!nasm_strnicmp(special, "protected", n)) | ||
77 | + sym->other = STV_PROTECTED; | ||
78 | + else | ||
79 | + n = 0; | ||
80 | + special += n; | ||
81 | + } | ||
82 | + | ||
83 | - if (special[n]) { | ||
84 | + if (*special) { | ||
85 | struct tokenval tokval; | ||
86 | expr *e; | ||
87 | int fwd = FALSE; | ||
88 | @@ -1120,7 +1149,8 @@ static struct SAA *elf_build_symtab(long | ||
89 | WRITELONG(p, sym->strpos); | ||
90 | WRITELONG(p, sym->value); | ||
91 | WRITELONG(p, sym->size); | ||
92 | - WRITESHORT(p, sym->type); /* local non-typed thing */ | ||
93 | + WRITECHAR(p, sym->type); /* local non-typed thing */ | ||
94 | + WRITECHAR(p, sym->other); | ||
95 | WRITESHORT(p, sym->section); | ||
96 | saa_wbytes(s, entry, 16L); | ||
97 | *len += 16; | ||
98 | @@ -1138,7 +1168,8 @@ static struct SAA *elf_build_symtab(long | ||
99 | WRITELONG(p, sym->strpos); | ||
100 | WRITELONG(p, sym->value); | ||
101 | WRITELONG(p, sym->size); | ||
102 | - WRITESHORT(p, sym->type); /* global non-typed thing */ | ||
103 | + WRITECHAR(p, sym->type); /* global non-typed thing */ | ||
104 | + WRITECHAR(p, sym->other); | ||
105 | WRITESHORT(p, sym->section); | ||
106 | saa_wbytes(s, entry, 16L); | ||
107 | *len += 16; |