From cab0ccf0bd71bcdc17ee8590c0e68f4c3c2d47ee Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 8 Sep 2021 19:02:38 +0900 Subject: [PATCH] [Mach-O] Add a stub for Mach-O --- Makefile | 12 ++++++++---- elf/main.cc | 17 +++++------------ elf/mold.h | 3 +++ macho/main.cc | 9 +++++++++ macho/mold.h | 5 +++++ main.cc | 14 ++++++++++++++ 6 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 macho/main.cc create mode 100644 macho/mold.h create mode 100644 main.cc diff --git a/Makefile b/Makefile index 02644416..a282a479 100644 --- a/Makefile +++ b/Makefile @@ -17,9 +17,9 @@ CPPFLAGS = -g -pthread -std=c++20 -fPIE \ LDFLAGS += $(EXTRA_LDFLAGS) LIBS = -pthread -lz -lxxhash -ldl -lm -SRCS=$(wildcard elf/*.cc) -HEADERS=$(wildcard elf/*.h) -OBJS=$(SRCS:elf/%.cc=out/elf/%.o) +SRCS=$(wildcard *.cc elf/*.cc macho/*.cc) +HEADERS=$(wildcard *.h elf/*.h macho/*.h) +OBJS=$(SRCS:%.cc=out/%.o) PREFIX ?= /usr DEST = $(DESTDIR)$(PREFIX) @@ -79,13 +79,17 @@ mold: $(OBJS) $(MIMALLOC_LIB) $(TBB_LIB) mold-wrapper.so: elf/mold-wrapper.c Makefile $(CC) -fPIC -shared -o $@ $< -ldl -out/elf/%.o: elf/%.cc $(HEADERS) Makefile out/elf/.keep +out/%.o: %.cc $(HEADERS) Makefile out/elf/.keep out/macho/.keep $(CXX) $(CPPFLAGS) -c -o $@ $< out/elf/.keep: mkdir -p out/elf touch $@ +out/macho/.keep: + mkdir -p out/macho + touch $@ + $(MIMALLOC_LIB): mkdir -p out/mimalloc (cd out/mimalloc; CFLAGS=-DMI_USE_ENVIRON=0 cmake -G'Unix Makefiles' ../../third-party/mimalloc) diff --git a/elf/main.cc b/elf/main.cc index 725731bd..9a594eb5 100644 --- a/elf/main.cc +++ b/elf/main.cc @@ -323,7 +323,7 @@ static void show_stats(Context &ctx) { } template -int do_main(int argc, char **argv) { +int elf_main(int argc, char **argv) { Context ctx; // Process -run option first. process_run_subcommand() does not return. @@ -340,9 +340,9 @@ int do_main(int argc, char **argv) { if (ctx.arg.emulation != E::e_machine) { switch (ctx.arg.emulation) { case EM_386: - return do_main(argc, argv); + return elf_main(argc, argv); case EM_AARCH64: - return do_main(argc, argv); + return elf_main(argc, argv); } unreachable(ctx); } @@ -673,18 +673,11 @@ int do_main(int argc, char **argv) { #define INSTANTIATE(E) \ template void read_file(Context &, MemoryMappedFile *); \ - template std::string_view save_string(Context &, const std::string &) + template std::string_view save_string(Context &, const std::string &); \ + template int elf_main(int, char **); INSTANTIATE(X86_64); INSTANTIATE(I386); INSTANTIATE(AARCH64); } // namespace mold::elf - -int main(int argc, char **argv) { - std::string_view cmd = mold::elf::path_filename(argv[0]); - if (cmd == "ld" || cmd == "mold" || cmd == "ld.mold") - return mold::elf::do_main(argc, argv); - std::cerr << "mold: unknown command: " << argv[0] << "\n"; - exit(1); -} diff --git a/elf/mold.h b/elf/mold.h index efee91f6..edc79a06 100644 --- a/elf/mold.h +++ b/elf/mold.h @@ -1671,6 +1671,9 @@ std::regex glob_to_regex(std::string_view pat); std::string errno_string(); std::string get_version_string(); +template +int elf_main(int argc, char **argv); + // // Error output // diff --git a/macho/main.cc b/macho/main.cc new file mode 100644 index 00000000..d17ec932 --- /dev/null +++ b/macho/main.cc @@ -0,0 +1,9 @@ +#include "mold.h" + +namespace mold::macho { + +int macho_main(int argc, char **argv) { + return 0; +} + +} diff --git a/macho/mold.h b/macho/mold.h new file mode 100644 index 00000000..9f7154cf --- /dev/null +++ b/macho/mold.h @@ -0,0 +1,5 @@ +namespace mold::macho { + +int macho_main(int argc, char **argv); + +} // namespace mold::macho diff --git a/main.cc b/main.cc new file mode 100644 index 00000000..6c00c724 --- /dev/null +++ b/main.cc @@ -0,0 +1,14 @@ +#include "elf/mold.h" +#include "macho/mold.h" + +int main(int argc, char **argv) { + std::string_view cmd = mold::elf::path_filename(argv[0]); + + if (cmd == "ld" || cmd == "mold" || cmd == "ld.mold") + return mold::elf::elf_main(argc, argv); + if (cmd == "ld64" || cmd == "ld64.mold") + return mold::macho::macho_main(argc, argv); + + std::cerr << "mold: unknown command: " << argv[0] << "\n"; + exit(1); +}