authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-03 12:34:20-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-03 12:34:20-05:00
log3be4b6434c0d96f8f6975c13c1a84f06a9857ed8
tree45650fe319d274154285b28906a98a9f2650109c
parente00eec1c299ccc721f4272a506321939be7094f1

add ability to set linker script


5 files changed, 17 insertions(+), 1 deletions(-)

src/all_types.hpp+1
...@@ -1223,6 +1223,7 @@ struct CodeGen {...@@ -1223,6 +1223,7 @@ struct CodeGen {
1223 Buf *mmacosx_version_min;1223 Buf *mmacosx_version_min;
1224 Buf *mios_version_min;1224 Buf *mios_version_min;
1225 bool linker_rdynamic;1225 bool linker_rdynamic;
1226 const char *linker_script;
12261227
1227 // The function definitions this module includes. There must be a corresponding1228 // The function definitions this module includes. There must be a corresponding
1228 // fn_protos entry.1229 // fn_protos entry.
src/codegen.cpp+5
...@@ -225,6 +225,11 @@ void codegen_set_rdynamic(CodeGen *g, bool rdynamic) {...@@ -225,6 +225,11 @@ void codegen_set_rdynamic(CodeGen *g, bool rdynamic) {
225 g->linker_rdynamic = rdynamic;225 g->linker_rdynamic = rdynamic;
226}226}
227227
228void codegen_set_linker_script(CodeGen *g, const char *linker_script) {
229 g->linker_script = linker_script;
230}
231
232
228static void render_const_val(CodeGen *g, ConstExprValue *const_val);233static void render_const_val(CodeGen *g, ConstExprValue *const_val);
229static void render_const_val_global(CodeGen *g, ConstExprValue *const_val, bool is_export);234static void render_const_val_global(CodeGen *g, ConstExprValue *const_val, bool is_export);
230235
src/codegen.hpp+1
...@@ -43,6 +43,7 @@ void codegen_set_mlinker_version(CodeGen *g, Buf *darwin_linker_version);...@@ -43,6 +43,7 @@ void codegen_set_mlinker_version(CodeGen *g, Buf *darwin_linker_version);
43void codegen_set_rdynamic(CodeGen *g, bool rdynamic);43void codegen_set_rdynamic(CodeGen *g, bool rdynamic);
44void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min);44void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min);
45void codegen_set_mios_version_min(CodeGen *g, Buf *mios_version_min);45void codegen_set_mios_version_min(CodeGen *g, Buf *mios_version_min);
46void codegen_set_linker_script(CodeGen *g, const char *linker_script);
4647
47void codegen_add_root_code(CodeGen *g, Buf *source_dir, Buf *source_basename, Buf *source_code);48void codegen_add_root_code(CodeGen *g, Buf *source_dir, Buf *source_basename, Buf *source_code);
4849
src/link.cpp+5
...@@ -154,6 +154,11 @@ static void construct_linker_job_linux(LinkJob *lj) {...@@ -154,6 +154,11 @@ static void construct_linker_job_linux(LinkJob *lj) {
154 find_libc_lib_path(g);154 find_libc_lib_path(g);
155 }155 }
156156
157 if (g->linker_script) {
158 lj->args.append("-T");
159 lj->args.append(g->linker_script);
160 }
161
157 lj->args.append("--gc-sections");162 lj->args.append("--gc-sections");
158163
159 lj->args.append("-m");164 lj->args.append("-m");
src/main.cpp+5-1
...@@ -56,6 +56,7 @@ static int usage(const char *arg0) {...@@ -56,6 +56,7 @@ static int usage(const char *arg0) {
56 " -mios-version-min [ver] (darwin only) set iOS deployment target\n"56 " -mios-version-min [ver] (darwin only) set iOS deployment target\n"
57 " -framework [name] (darwin only) link against framework\n"57 " -framework [name] (darwin only) link against framework\n"
58 " --check-unused perform semantic analysis on unused declarations\n"58 " --check-unused perform semantic analysis on unused declarations\n"
59 " --linker-script [path] use a custom linker script\n"
59 , arg0);60 , arg0);
60 return EXIT_FAILURE;61 return EXIT_FAILURE;
61}62}
...@@ -140,6 +141,7 @@ int main(int argc, char **argv) {...@@ -140,6 +141,7 @@ int main(int argc, char **argv) {
140 const char *mmacosx_version_min = nullptr;141 const char *mmacosx_version_min = nullptr;
141 const char *mios_version_min = nullptr;142 const char *mios_version_min = nullptr;
142 bool check_unused = false;143 bool check_unused = false;
144 const char *linker_script = nullptr;
143145
144 for (int i = 1; i < argc; i += 1) {146 for (int i = 1; i < argc; i += 1) {
145 char *arg = argv[i];147 char *arg = argv[i];
...@@ -231,6 +233,8 @@ int main(int argc, char **argv) {...@@ -231,6 +233,8 @@ int main(int argc, char **argv) {
231 mios_version_min = argv[i];233 mios_version_min = argv[i];
232 } else if (strcmp(arg, "-framework") == 0) {234 } else if (strcmp(arg, "-framework") == 0) {
233 frameworks.append(argv[i]);235 frameworks.append(argv[i]);
236 } else if (strcmp(arg, "--linker-script") == 0) {
237 linker_script = argv[i];
234 } else {238 } else {
235 fprintf(stderr, "Invalid argument: %s\n", arg);239 fprintf(stderr, "Invalid argument: %s\n", arg);
236 return usage(arg0);240 return usage(arg0);
...@@ -343,7 +347,7 @@ int main(int argc, char **argv) {...@@ -343,7 +347,7 @@ int main(int argc, char **argv) {
343 CodeGen *g = codegen_create(&root_source_dir, target);347 CodeGen *g = codegen_create(&root_source_dir, target);
344 codegen_set_is_release(g, is_release_build);348 codegen_set_is_release(g, is_release_build);
345 codegen_set_is_test(g, cmd == CmdTest);349 codegen_set_is_test(g, cmd == CmdTest);
346350 codegen_set_linker_script(g, linker_script);
347 codegen_set_check_unused(g, check_unused);351 codegen_set_check_unused(g, check_unused);
348352
349 codegen_set_clang_argv(g, clang_argv.items, clang_argv.length);353 codegen_set_clang_argv(g, clang_argv.items, clang_argv.length);