diff options
author | Sam Ravnborg <sam@ravnborg.org> | 2007-06-02 15:18:51 -0400 |
---|---|---|
committer | Sam Ravnborg <sam@ravnborg.org> | 2007-07-16 17:21:34 -0400 |
commit | 1087247b7d8f1938425906d2ac983df76c6dcc18 (patch) | |
tree | bfd2bfb82a68de0f74fa429258e8f7a233026df0 /scripts | |
parent | b28242e7e3c08072251da6d7bc4895fbd3e58299 (diff) |
kbuild: refactor code in modpost to improve maintainability
There were a great deal of overlap between the two functions
that check which sections may reference .init.text and .exit.text.
Factor out common check to a separate function and
sort entries in the original functions.
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/mod/modpost.c | 154 |
1 files changed, 75 insertions, 79 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 9c35f30d2eda..f22c8b4911bc 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -858,14 +858,6 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec, | |||
858 | elf->strtab + before->st_name, refsymname)) | 858 | elf->strtab + before->st_name, refsymname)) |
859 | return; | 859 | return; |
860 | 860 | ||
861 | /* fromsec whitelist - without a valid 'before' | ||
862 | * powerpc has a GOT table in .got2 section | ||
863 | * and also a .toc section */ | ||
864 | if (strcmp(fromsec, ".got2") == 0) | ||
865 | return; | ||
866 | if (strcmp(fromsec, ".toc") == 0) | ||
867 | return; | ||
868 | |||
869 | if (before && after) { | 861 | if (before && after) { |
870 | warn("%s(%s+0x%llx): Section mismatch: reference to %s:%s " | 862 | warn("%s(%s+0x%llx): Section mismatch: reference to %s:%s " |
871 | "(between '%s' and '%s')\n", | 863 | "(between '%s' and '%s')\n", |
@@ -1087,6 +1079,61 @@ static void check_sec_ref(struct module *mod, const char *modname, | |||
1087 | } | 1079 | } |
1088 | } | 1080 | } |
1089 | 1081 | ||
1082 | /* | ||
1083 | * Identify sections from which references to either a | ||
1084 | * .init or a .exit section is OK. | ||
1085 | * | ||
1086 | * [OPD] Keith Ownes <kaos@sgi.com> commented: | ||
1087 | * For our future {in}sanity, add a comment that this is the ppc .opd | ||
1088 | * section, not the ia64 .opd section. | ||
1089 | * ia64 .opd should not point to discarded sections. | ||
1090 | * [.rodata] like for .init.text we ignore .rodata references -same reason | ||
1091 | **/ | ||
1092 | static int initexit_section_ref_ok(const char *name) | ||
1093 | { | ||
1094 | const char **s; | ||
1095 | /* Absolute section names */ | ||
1096 | const char *namelist1[] = { | ||
1097 | "__bug_table", /* used by powerpc for BUG() */ | ||
1098 | "__ex_table", | ||
1099 | ".altinstructions", | ||
1100 | ".cranges", /* used by sh64 */ | ||
1101 | ".fixup", | ||
1102 | ".opd", /* See comment [OPD] */ | ||
1103 | ".parainstructions", | ||
1104 | ".pdr", | ||
1105 | ".plt", /* seen on ARCH=um build on x86_64. Harmless */ | ||
1106 | ".smp_locks", | ||
1107 | ".stab", | ||
1108 | NULL | ||
1109 | }; | ||
1110 | /* Start of section names */ | ||
1111 | const char *namelist2[] = { | ||
1112 | ".debug", | ||
1113 | ".eh_frame", | ||
1114 | ".note", /* ignore ELF notes - may contain anything */ | ||
1115 | ".got", /* powerpc - global offset table */ | ||
1116 | ".toc", /* powerpc - table of contents */ | ||
1117 | NULL | ||
1118 | }; | ||
1119 | /* part of section name */ | ||
1120 | const char *namelist3 [] = { | ||
1121 | ".unwind", /* Sample: IA_64.unwind.exit.text */ | ||
1122 | NULL | ||
1123 | }; | ||
1124 | |||
1125 | for (s = namelist1; *s; s++) | ||
1126 | if (strcmp(*s, name) == 0) | ||
1127 | return 1; | ||
1128 | for (s = namelist2; *s; s++) | ||
1129 | if (strncmp(*s, name, strlen(*s)) == 0) | ||
1130 | return 1; | ||
1131 | for (s = namelist3; *s; s++) | ||
1132 | if (strstr(name, *s) != NULL) | ||
1133 | return 1; | ||
1134 | return 0; | ||
1135 | } | ||
1136 | |||
1090 | /** | 1137 | /** |
1091 | * Functions used only during module init is marked __init and is stored in | 1138 | * Functions used only during module init is marked __init and is stored in |
1092 | * a .init.text section. Likewise data is marked __initdata and stored in | 1139 | * a .init.text section. Likewise data is marked __initdata and stored in |
@@ -1103,7 +1150,7 @@ static int init_section(const char *name) | |||
1103 | return 0; | 1150 | return 0; |
1104 | } | 1151 | } |
1105 | 1152 | ||
1106 | /** | 1153 | /* |
1107 | * Identify sections from which references to a .init section is OK. | 1154 | * Identify sections from which references to a .init section is OK. |
1108 | * | 1155 | * |
1109 | * Unfortunately references to read only data that referenced .init | 1156 | * Unfortunately references to read only data that referenced .init |
@@ -1117,59 +1164,41 @@ static int init_section(const char *name) | |||
1117 | * | 1164 | * |
1118 | * where vgacon_startup is __init. If you want to wade through the false | 1165 | * where vgacon_startup is __init. If you want to wade through the false |
1119 | * positives, take out the check for rodata. | 1166 | * positives, take out the check for rodata. |
1120 | **/ | 1167 | */ |
1121 | static int init_section_ref_ok(const char *name) | 1168 | static int init_section_ref_ok(const char *name) |
1122 | { | 1169 | { |
1123 | const char **s; | 1170 | const char **s; |
1124 | /* Absolute section names */ | 1171 | /* Absolute section names */ |
1125 | const char *namelist1[] = { | 1172 | const char *namelist1[] = { |
1126 | ".init", | ||
1127 | ".opd", /* see comment [OPD] at exit_section_ref_ok() */ | ||
1128 | ".toc1", /* used by ppc64 */ | ||
1129 | ".stab", | ||
1130 | ".data.rel.ro", /* used by parisc64 */ | ||
1131 | ".parainstructions", | ||
1132 | ".text.lock", | ||
1133 | "__bug_table", /* used by powerpc for BUG() */ | ||
1134 | ".pci_fixup_header", | ||
1135 | ".pci_fixup_final", | ||
1136 | ".pdr", | ||
1137 | "__param", | ||
1138 | "__ex_table", | ||
1139 | ".fixup", | ||
1140 | ".smp_locks", | ||
1141 | ".plt", /* seen on ARCH=um build on x86_64. Harmless */ | ||
1142 | "__ftr_fixup", /* powerpc cpu feature fixup */ | 1173 | "__ftr_fixup", /* powerpc cpu feature fixup */ |
1143 | "__fw_ftr_fixup", /* powerpc firmware feature fixup */ | 1174 | "__fw_ftr_fixup", /* powerpc firmware feature fixup */ |
1144 | ".cranges", /* used by sh64 */ | 1175 | "__param", |
1176 | ".data.rel.ro", /* used by parisc64 */ | ||
1177 | ".init", | ||
1178 | ".text.lock", | ||
1145 | NULL | 1179 | NULL |
1146 | }; | 1180 | }; |
1147 | /* Start of section names */ | 1181 | /* Start of section names */ |
1148 | const char *namelist2[] = { | 1182 | const char *namelist2[] = { |
1149 | ".init.", | 1183 | ".init.", |
1150 | ".altinstructions", | 1184 | ".pci_fixup", |
1151 | ".eh_frame", | ||
1152 | ".debug", | ||
1153 | ".parainstructions", | ||
1154 | ".rodata", | 1185 | ".rodata", |
1155 | ".note", /* ignore ELF notes - may contain anything */ | ||
1156 | NULL | ||
1157 | }; | ||
1158 | /* part of section name */ | ||
1159 | const char *namelist3 [] = { | ||
1160 | ".unwind", /* sample: IA_64.unwind.init.text */ | ||
1161 | NULL | 1186 | NULL |
1162 | }; | 1187 | }; |
1163 | 1188 | ||
1189 | if (initexit_section_ref_ok(name)) | ||
1190 | return 1; | ||
1191 | |||
1164 | for (s = namelist1; *s; s++) | 1192 | for (s = namelist1; *s; s++) |
1165 | if (strcmp(*s, name) == 0) | 1193 | if (strcmp(*s, name) == 0) |
1166 | return 1; | 1194 | return 1; |
1167 | for (s = namelist2; *s; s++) | 1195 | for (s = namelist2; *s; s++) |
1168 | if (strncmp(*s, name, strlen(*s)) == 0) | 1196 | if (strncmp(*s, name, strlen(*s)) == 0) |
1169 | return 1; | 1197 | return 1; |
1170 | for (s = namelist3; *s; s++) | 1198 | |
1171 | if (strstr(name, *s) != NULL) | 1199 | /* If section name ends with ".init" we allow references |
1172 | return 1; | 1200 | * as is the case with .initcallN.init, .early_param.init, .taglist.init etc |
1201 | */ | ||
1173 | if (strrcmp(name, ".init") == 0) | 1202 | if (strrcmp(name, ".init") == 0) |
1174 | return 1; | 1203 | return 1; |
1175 | return 0; | 1204 | return 0; |
@@ -1194,59 +1223,26 @@ static int exit_section(const char *name) | |||
1194 | 1223 | ||
1195 | /* | 1224 | /* |
1196 | * Identify sections from which references to a .exit section is OK. | 1225 | * Identify sections from which references to a .exit section is OK. |
1197 | * | 1226 | */ |
1198 | * [OPD] Keith Ownes <kaos@sgi.com> commented: | ||
1199 | * For our future {in}sanity, add a comment that this is the ppc .opd | ||
1200 | * section, not the ia64 .opd section. | ||
1201 | * ia64 .opd should not point to discarded sections. | ||
1202 | * [.rodata] like for .init.text we ignore .rodata references -same reason | ||
1203 | **/ | ||
1204 | static int exit_section_ref_ok(const char *name) | 1227 | static int exit_section_ref_ok(const char *name) |
1205 | { | 1228 | { |
1206 | const char **s; | 1229 | const char **s; |
1207 | /* Absolute section names */ | 1230 | /* Absolute section names */ |
1208 | const char *namelist1[] = { | 1231 | const char *namelist1[] = { |
1209 | ".exit.text", | ||
1210 | ".exit.data", | 1232 | ".exit.data", |
1233 | ".exit.text", | ||
1234 | ".exitcall.exit", | ||
1211 | ".init.text", | 1235 | ".init.text", |
1212 | ".rodata", | 1236 | ".rodata", |
1213 | ".opd", /* See comment [OPD] */ | ||
1214 | ".toc1", /* used by ppc64 */ | ||
1215 | ".altinstructions", | ||
1216 | ".pdr", | ||
1217 | "__bug_table", /* used by powerpc for BUG() */ | ||
1218 | ".exitcall.exit", | ||
1219 | ".eh_frame", | ||
1220 | ".parainstructions", | ||
1221 | ".stab", | ||
1222 | "__ex_table", | ||
1223 | ".fixup", | ||
1224 | ".smp_locks", | ||
1225 | ".plt", /* seen on ARCH=um build on x86_64. Harmless */ | ||
1226 | ".cranges", /* used by sh64 */ | ||
1227 | NULL | ||
1228 | }; | ||
1229 | /* Start of section names */ | ||
1230 | const char *namelist2[] = { | ||
1231 | ".debug", | ||
1232 | ".note", /* ignore ELF notes - may contain anything */ | ||
1233 | NULL | ||
1234 | }; | ||
1235 | /* part of section name */ | ||
1236 | const char *namelist3 [] = { | ||
1237 | ".unwind", /* Sample: IA_64.unwind.exit.text */ | ||
1238 | NULL | 1237 | NULL |
1239 | }; | 1238 | }; |
1240 | 1239 | ||
1240 | if (initexit_section_ref_ok(name)) | ||
1241 | return 1; | ||
1242 | |||
1241 | for (s = namelist1; *s; s++) | 1243 | for (s = namelist1; *s; s++) |
1242 | if (strcmp(*s, name) == 0) | 1244 | if (strcmp(*s, name) == 0) |
1243 | return 1; | 1245 | return 1; |
1244 | for (s = namelist2; *s; s++) | ||
1245 | if (strncmp(*s, name, strlen(*s)) == 0) | ||
1246 | return 1; | ||
1247 | for (s = namelist3; *s; s++) | ||
1248 | if (strstr(name, *s) != NULL) | ||
1249 | return 1; | ||
1250 | return 0; | 1246 | return 0; |
1251 | } | 1247 | } |
1252 | 1248 | ||