| 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 | 1223 | Buf *mmacosx_version_min; |
| 1224 | 1224 | Buf *mios_version_min; |
| 1225 | 1225 | bool linker_rdynamic; |
| 1226 | const char *linker_script; | |
| 1226 | 1227 | |
| 1227 | 1228 | // The function definitions this module includes. There must be a corresponding |
| 1228 | 1229 | // fn_protos entry. |
src/codegen.cpp+5| ... | ... | @@ -225,6 +225,11 @@ void codegen_set_rdynamic(CodeGen *g, bool rdynamic) { |
| 225 | 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 | 233 | static void render_const_val(CodeGen *g, ConstExprValue *const_val); |
| 229 | 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 | 43 | void codegen_set_rdynamic(CodeGen *g, bool rdynamic); |
| 44 | 44 | void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min); |
| 45 | 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 | 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 | 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 | 162 | lj->args.append("--gc-sections"); |
| 158 | 163 | |
| 159 | 164 | lj->args.append("-m"); |
src/main.cpp+5-1| ... | ... | @@ -56,6 +56,7 @@ static int usage(const char *arg0) { |
| 56 | 56 | " -mios-version-min [ver] (darwin only) set iOS deployment target\n" |
| 57 | 57 | " -framework [name] (darwin only) link against framework\n" |
| 58 | 58 | " --check-unused perform semantic analysis on unused declarations\n" |
| 59 | " --linker-script [path] use a custom linker script\n" | |
| 59 | 60 | , arg0); |
| 60 | 61 | return EXIT_FAILURE; |
| 61 | 62 | } |
| ... | ... | @@ -140,6 +141,7 @@ int main(int argc, char **argv) { |
| 140 | 141 | const char *mmacosx_version_min = nullptr; |
| 141 | 142 | const char *mios_version_min = nullptr; |
| 142 | 143 | bool check_unused = false; |
| 144 | const char *linker_script = nullptr; | |
| 143 | 145 | |
| 144 | 146 | for (int i = 1; i < argc; i += 1) { |
| 145 | 147 | char *arg = argv[i]; |
| ... | ... | @@ -231,6 +233,8 @@ int main(int argc, char **argv) { |
| 231 | 233 | mios_version_min = argv[i]; |
| 232 | 234 | } else if (strcmp(arg, "-framework") == 0) { |
| 233 | 235 | frameworks.append(argv[i]); |
| 236 | } else if (strcmp(arg, "--linker-script") == 0) { | |
| 237 | linker_script = argv[i]; | |
| 234 | 238 | } else { |
| 235 | 239 | fprintf(stderr, "Invalid argument: %s\n", arg); |
| 236 | 240 | return usage(arg0); |
| ... | ... | @@ -343,7 +347,7 @@ int main(int argc, char **argv) { |
| 343 | 347 | CodeGen *g = codegen_create(&root_source_dir, target); |
| 344 | 348 | codegen_set_is_release(g, is_release_build); |
| 345 | 349 | codegen_set_is_test(g, cmd == CmdTest); |
| 346 | ||
| 350 | codegen_set_linker_script(g, linker_script); | |
| 347 | 351 | codegen_set_check_unused(g, check_unused); |
| 348 | 352 | |
| 349 | 353 | codegen_set_clang_argv(g, clang_argv.items, clang_argv.length); |