1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-20 09:27:45 +03:00

[Mach-O] Report errors in -{un,}exported_symbols_list early

This commit is contained in:
Rui Ueyama 2022-06-05 18:02:47 +08:00
parent eee315ea52
commit 2d34ba13cb
3 changed files with 21 additions and 23 deletions

View File

@ -305,9 +305,13 @@ std::vector<std::string> parse_nonpositional_args(Context<E> &ctx) {
} else if (read_flag("-export_dynamic")) {
ctx.arg.export_dynamic = true;
} else if (read_arg("-exported_symbol")) {
ctx.arg.exported_symbols_list.push_back(std::string(arg));
if (!ctx.arg.exported_symbols_list.add(arg, 1))
Fatal(ctx) << "-exported_symbol: invalid glob pattern: " << arg;
} else if (read_arg("-exported_symbols_list")) {
append(ctx.arg.exported_symbols_list, read_lines(ctx, arg));
for (std::string_view pat : read_lines(ctx, arg))
if (!ctx.arg.exported_symbols_list.add(pat, 1))
Fatal(ctx) << "-exported_symbols_list: " << arg
<< ": invalid glob pattern: " << pat;
} else if (read_arg("-fatal_warnings")) {
} else if (read_arg("-filelist")) {
remaining.push_back("-filelist");
@ -385,9 +389,13 @@ std::vector<std::string> parse_nonpositional_args(Context<E> &ctx) {
} else if (read_arg("-thread_count")) {
ctx.arg.thread_count = std::stoi(std::string(arg));
} else if (read_arg("-unexported_symbol")) {
ctx.arg.unexported_symbols_list.push_back(std::string(arg));
if (!ctx.arg.unexported_symbols_list.add(arg, 1))
Fatal(ctx) << "-unexported_symbol: invalid glob pattern: " << arg;
} else if (read_arg("-unexported_symbols_list")) {
append(ctx.arg.unexported_symbols_list, read_lines(ctx, arg));
for (std::string_view pat : read_lines(ctx, arg))
if (!ctx.arg.unexported_symbols_list.add(pat, 1))
Fatal(ctx) << "-unexported_symbols_list: " << arg
<< ": invalid glob pattern: " << pat;
} else if (read_flag("-v")) {
SyncOut(ctx) << mold_version;
} else if (read_arg("-weak_framework")) {
@ -461,6 +469,9 @@ std::vector<std::string> parse_nonpositional_args(Context<E> &ctx) {
if (ctx.arg.uuid == UUID_RANDOM)
memcpy(ctx.uuid, get_uuid_v4().data(), 16);
ctx.arg.exported_symbols_list.compile();
ctx.arg.unexported_symbols_list.compile();
return remaining;
}

View File

@ -76,19 +76,12 @@ static void handle_exported_symbols_list(Context<E> &ctx) {
if (ctx.arg.exported_symbols_list.empty())
return;
MultiGlob matcher;
for (std::string_view pat : ctx.arg.exported_symbols_list)
if (!matcher.add(pat, 1))
Fatal(ctx) << "-exported_symbols_list: invalid glob pattern: " << pat;
matcher.compile();
tbb::parallel_for_each(ctx.objs, [&](ObjectFile<E> *file) {
for (Symbol<E> *sym : file->syms)
if (sym && sym->file == file)
if (sym->scope == SCOPE_EXTERN || sym->scope == SCOPE_PRIVATE_EXTERN)
sym->scope =
matcher.find(sym->name) ? SCOPE_EXTERN : SCOPE_PRIVATE_EXTERN;
sym->scope = ctx.arg.exported_symbols_list.find(sym->name)
? SCOPE_EXTERN : SCOPE_PRIVATE_EXTERN;
});
}
@ -98,17 +91,11 @@ static void handle_unexported_symbols_list(Context<E> &ctx) {
if (ctx.arg.unexported_symbols_list.empty())
return;
MultiGlob matcher;
for (std::string_view pat : ctx.arg.unexported_symbols_list)
if (!matcher.add(pat, 1))
Fatal(ctx) << "-unexported_symbols_list: invalid glob pattern: " << pat;
matcher.compile();
tbb::parallel_for_each(ctx.objs, [&](ObjectFile<E> *file) {
for (Symbol<E> *sym : file->syms)
if (sym && sym->file == file)
if (sym->scope == SCOPE_EXTERN && matcher.find(sym->name))
if (sym->scope == SCOPE_EXTERN &&
ctx.arg.unexported_symbols_list.find(sym->name))
sym->scope = SCOPE_PRIVATE_EXTERN;
});
}

View File

@ -821,6 +821,8 @@ struct Context {
// Command-line arguments
struct {
MultiGlob exported_symbols_list;
MultiGlob unexported_symbols_list;
Symbol<E> *entry = nullptr;
UuidKind uuid = UUID_HASH;
bool ObjC = false;
@ -860,13 +862,11 @@ struct Context {
std::string output = "a.out";
std::vector<SectCreateOption> sectcreate;
std::vector<std::string> U;
std::vector<std::string> exported_symbols_list;
std::vector<std::string> framework_paths;
std::vector<std::string> library_paths;
std::vector<std::string> mllvm;
std::vector<std::string> rpath;
std::vector<std::string> syslibroot;
std::vector<std::string> unexported_symbols_list;
} arg;
std::vector<std::string_view> cmdline_args;