aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/all_types.hpp1
-rw-r--r--src/codegen.cpp3
-rw-r--r--src/link.cpp4
-rw-r--r--src/main.cpp5
4 files changed, 12 insertions, 1 deletions
diff --git a/src/all_types.hpp b/src/all_types.hpp
index fe77d3db3b..4b957b18a3 100644
--- a/src/all_types.hpp
+++ b/src/all_types.hpp
@@ -2131,6 +2131,7 @@ struct CodeGen {
bool have_winmain_crt_startup;
bool have_dllmain_crt_startup;
bool have_err_ret_tracing;
+ bool link_eh_frame_hdr;
bool c_want_stdint;
bool c_want_stdbool;
bool verbose_tokenize;
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 59f69539bc..7cb1218120 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -8629,6 +8629,7 @@ static Error define_builtin_compile_vars(CodeGen *g) {
cache_bool(&cache_hash, g->have_err_ret_tracing);
cache_bool(&cache_hash, g->libc_link_lib != nullptr);
cache_bool(&cache_hash, g->valgrind_support);
+ cache_bool(&cache_hash, g->link_eh_frame_hdr);
cache_int(&cache_hash, detect_subsystem(g));
Buf digest = BUF_INIT;
@@ -9510,6 +9511,7 @@ Error create_c_object_cache(CodeGen *g, CacheHash **out_cache_hash, bool verbose
cache_int(cache_hash, g->build_mode);
cache_bool(cache_hash, g->have_pic);
cache_bool(cache_hash, g->have_sanitize_c);
+ cache_bool(cache_hash, g->link_eh_frame_hdr);
cache_bool(cache_hash, want_valgrind_support(g));
cache_bool(cache_hash, g->function_sections);
for (size_t arg_i = 0; arg_i < g->clang_argv_len; arg_i += 1) {
@@ -10279,6 +10281,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {
cache_buf_opt(ch, g->test_filter);
cache_buf_opt(ch, g->test_name_prefix);
}
+ cache_bool(ch, g->link_eh_frame_hdr);
cache_bool(ch, g->is_single_threaded);
cache_bool(ch, g->linker_rdynamic);
cache_bool(ch, g->each_lib_rpath);
diff --git a/src/link.cpp b/src/link.cpp
index 54a8b208fd..e0deb0d413 100644
--- a/src/link.cpp
+++ b/src/link.cpp
@@ -1647,7 +1647,9 @@ static void construct_linker_job_elf(LinkJob *lj) {
lj->args.append("--gc-sections");
}
- lj->args.append("--eh-frame-hdr");
+ if (g->link_eh_frame_hdr) {
+ lj->args.append("--eh-frame-hdr");
+ }
lj->args.append("-m");
lj->args.append(getLDMOption(g->zig_target));
diff --git a/src/main.cpp b/src/main.cpp
index 8a661bfa05..0b12218d62 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -55,6 +55,7 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) {
" --color [auto|off|on] enable or disable colored error messages\n"
" --disable-gen-h do not generate a C header file (.h)\n"
" --disable-valgrind omit valgrind client requests in debug builds\n"
+ " --eh-frame-hdr enable C++ exception handling by passing --eh-frame-hdr to linker\n"
" --enable-valgrind include valgrind client requests release builds\n"
" -fstack-check enable stack probing in unsafe builds\n"
" -fno-stack-check disable stack probing in safe builds\n"
@@ -477,6 +478,7 @@ int main(int argc, char **argv) {
bool verbose_llvm_ir = false;
bool verbose_cimport = false;
bool verbose_cc = false;
+ bool link_eh_frame_hdr = false;
ErrColor color = ErrColorAuto;
CacheOpt enable_cache = CacheOptAuto;
Buf *dynamic_linker = nullptr;
@@ -715,6 +717,8 @@ int main(int argc, char **argv) {
valgrind_support = ValgrindSupportEnabled;
} else if (strcmp(arg, "--disable-valgrind") == 0) {
valgrind_support = ValgrindSupportDisabled;
+ } else if (strcmp(arg, "--eh-frame-hdr") == 0) {
+ link_eh_frame_hdr = true;
} else if (strcmp(arg, "-fPIC") == 0) {
want_pic = WantPICEnabled;
} else if (strcmp(arg, "-fno-PIC") == 0) {
@@ -1191,6 +1195,7 @@ int main(int argc, char **argv) {
override_lib_dir, libc, cache_dir_buf, cmd == CmdTest, root_progress_node);
if (llvm_argv.length >= 2) codegen_set_llvm_argv(g, llvm_argv.items + 1, llvm_argv.length - 2);
g->valgrind_support = valgrind_support;
+ g->link_eh_frame_hdr = link_eh_frame_hdr;
g->want_pic = want_pic;
g->want_stack_check = want_stack_check;
g->want_sanitize_c = want_sanitize_c;