comparison lwasm/section.c @ 432:58cafa61ab40

Add support for undocumented custom module format (for LW) Nothing to see here. Move along. These are not the droids you are looking for.
author William Astle <lost@l-w.ca>
date Fri, 18 Nov 2016 21:25:43 -0700
parents 8764142b3192
children ed7b8f74087d
comparison
equal deleted inserted replaced
431:6df8d62302e2 432:58cafa61ab40
33 char *p2; 33 char *p2;
34 char *sn; 34 char *sn;
35 char *opts = NULL; 35 char *opts = NULL;
36 sectiontab_t *s; 36 sectiontab_t *s;
37 37
38 if (as -> output_format != OUTPUT_OBJ) 38 if (as -> output_format != OUTPUT_OBJ && as -> output_format != OUTPUT_LWMOD)
39 { 39 {
40 lwasm_register_error(as, l, E_SECTION_TARGET); 40 lwasm_register_error(as, l, E_SECTION_TARGET);
41 return; 41 return;
42 } 42 }
43 43
60 /* do nothing */ ; 60 /* do nothing */ ;
61 61
62 sn = lw_strndup(*p, p2 - *p); 62 sn = lw_strndup(*p, p2 - *p);
63 *p = p2; 63 *p = p2;
64 64
65 if (**p == ',') 65 if (**p == ',' && as -> output_format != OUTPUT_LWMOD)
66 { 66 {
67 // have opts 67 // have opts
68 (*p)++; 68 (*p)++;
69 69
70 for (p2 = *p; *p2 && !isspace(*p2); p2++) 70 for (p2 = *p; *p2 && !isspace(*p2); p2++)
71 /* do nothing */ ; 71 /* do nothing */ ;
72 72
73 opts = lw_strndup(*p, p2 - *p); 73 opts = lw_strndup(*p, p2 - *p);
74 *p = p2; 74 *p = p2;
75 }
76
77 if (as -> output_format == OUTPUT_LWMOD)
78 {
79 for (p2 = sn; *p2; p2++)
80 *p2 = tolower(*p2);
81
82 if (strcmp(sn, "bss") && strcmp(sn, "main") && strcmp(sn, "init") && strcmp(sn, "calls") && strcmp(sn, "modname"))
83 {
84 lwasm_register_error(as, l, E_SECTION_NAME);
85 lw_free(sn);
86 lw_free(opts);
87 return;
88 }
75 } 89 }
76 90
77 for (s = as -> sections; s; s = s -> next) 91 for (s = as -> sections; s; s = s -> next)
78 { 92 {
79 if (!strcmp(s -> name, sn)) 93 if (!strcmp(s -> name, sn))
88 // create section data structure 102 // create section data structure
89 s = lw_alloc(sizeof(sectiontab_t)); 103 s = lw_alloc(sizeof(sectiontab_t));
90 s -> oblen = 0; 104 s -> oblen = 0;
91 s -> obsize = 0; 105 s -> obsize = 0;
92 s -> obytes = NULL; 106 s -> obytes = NULL;
107 s -> tbase = -1;
93 s -> name = lw_strdup(sn); 108 s -> name = lw_strdup(sn);
94 s -> offset = lw_expr_build(lw_expr_type_special, lwasm_expr_secbase, s); 109 s -> offset = lw_expr_build(lw_expr_type_special, lwasm_expr_secbase, s);
95 s -> flags = section_flag_none; 110 s -> flags = section_flag_none;
96 s -> reloctab = NULL; 111 s -> reloctab = NULL;
97 if (!strcasecmp(sn, "bss") || !strcasecmp(sn, ".bss")) 112 if (!strcasecmp(sn, "bss") || !strcasecmp(sn, ".bss"))