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:
parent
eee315ea52
commit
2d34ba13cb
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user