| author | |
| committer | |
| log | 3be4b6434c0d96f8f6975c13c1a84f06a9857ed8 |
| tree | 45650fe319d274154285b28906a98a9f2650109c |
| parent | e00eec1c299ccc721f4272a506321939be7094f1 |
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; | ||
| 1226 | 1227 | ||
| 1227 | // The function definitions this module includes. There must be a corresponding | 1228 | // 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 | } |
| 227 | 227 | ||
| 228 | void codegen_set_linker_script(CodeGen *g, const char *linker_script) { | ||
| 229 | g->linker_script = linker_script; | ||
| 230 | } | ||
| 231 | |||
| 232 | |||
| 228 | static void render_const_val(CodeGen *g, ConstExprValue *const_val); | 233 | static void render_const_val(CodeGen *g, ConstExprValue *const_val); |
| 229 | static void render_const_val_global(CodeGen *g, ConstExprValue *const_val, bool is_export); | 234 | static void render_const_val_global(CodeGen *g, ConstExprValue *const_val, bool is_export); |
| 230 | 235 |
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); |
| 43 | void codegen_set_rdynamic(CodeGen *g, bool rdynamic); | 43 | void codegen_set_rdynamic(CodeGen *g, bool rdynamic); |
| 44 | void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min); | 44 | void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min); |
| 45 | void codegen_set_mios_version_min(CodeGen *g, Buf *mios_version_min); | 45 | void codegen_set_mios_version_min(CodeGen *g, Buf *mios_version_min); |
| 46 | void codegen_set_linker_script(CodeGen *g, const char *linker_script); | ||
| 46 | 47 | ||
| 47 | void codegen_add_root_code(CodeGen *g, Buf *source_dir, Buf *source_basename, Buf *source_code); | 48 | void codegen_add_root_code(CodeGen *g, Buf *source_dir, Buf *source_basename, Buf *source_code); |
| 48 | 49 |
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 | } |
| 156 | 156 | ||
| 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"); |
| 158 | 163 | ||
| 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; | ||
| 143 | 145 | ||
| 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); |
| 346 | 350 | codegen_set_linker_script(g, linker_script); | |
| 347 | codegen_set_check_unused(g, check_unused); | 351 | codegen_set_check_unused(g, check_unused); |
| 348 | 352 | ||
| 349 | codegen_set_clang_argv(g, clang_argv.items, clang_argv.length); | 353 | codegen_set_clang_argv(g, clang_argv.items, clang_argv.length); |