diff options
author | Derek Schuff <dschuff@chromium.org> | 2016-05-05 08:01:57 -0700 |
---|---|---|
committer | Derek Schuff <dschuff@chromium.org> | 2016-05-05 08:01:57 -0700 |
commit | 2811727a118e92e6b7ef293458f9bab1cf5dacdc (patch) | |
tree | ad18967b67f3596b28f3013ad6f05cc269d126c6 /src/s2wasm-main.cpp | |
parent | 1397997bc91663f19c387c69c7e47930efe57539 (diff) | |
download | binaryen-2811727a118e92e6b7ef293458f9bab1cf5dacdc.tar.gz binaryen-2811727a118e92e6b7ef293458f9bab1cf5dacdc.tar.bz2 binaryen-2811727a118e92e6b7ef293458f9bab1cf5dacdc.zip |
[Linker] Handle archive files
Add a class to parse archive files.
Support linking archive files, with archive semantics (i.e. an archive
member is linked in if it satisfies an undefined reference).
Archive files must be gnu-format archives containing .s files.
Add tests for linking semantics.
Diffstat (limited to 'src/s2wasm-main.cpp')
-rw-r--r-- | src/s2wasm-main.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/s2wasm-main.cpp b/src/s2wasm-main.cpp index 7b0e4c179..9688f6696 100644 --- a/src/s2wasm-main.cpp +++ b/src/s2wasm-main.cpp @@ -32,6 +32,7 @@ int main(int argc, const char *argv[]) { bool ignoreUnknownSymbols = false; bool generateEmscriptenGlue = false; std::string startFunction; + std::vector<std::string> archiveLibraries; Options options("s2wasm", "Link .s file into .wast"); options .add("--output", "-o", "Output file (stdout if not specified)", @@ -75,13 +76,19 @@ int main(int argc, const char *argv[]) { [&generateEmscriptenGlue](Options *, const std::string &) { generateEmscriptenGlue = true; }) + .add("--library", "-l", "Add archive library", + Options::Arguments::N, + [&archiveLibraries](Options *o, const std::string &argument) { + archiveLibraries.push_back(argument); + }) .add_positional("INFILE", Options::Arguments::One, [](Options *o, const std::string &argument) { o->extra["infile"] = argument; }); options.parse(argc, argv); - auto input(read_file<std::string>(options.extra["infile"], Flags::Text, options.debug ? Flags::Debug : Flags::Release)); + auto debugFlag = options.debug ? Flags::Debug : Flags::Release; + auto input(read_file<std::string>(options.extra["infile"], Flags::Text, debugFlag)); if (options.debug) std::cerr << "Parsing and wasming..." << std::endl; uint64_t globalBase = options.extra.find("global-base") != options.extra.end() @@ -107,10 +114,13 @@ int main(int argc, const char *argv[]) { S2WasmBuilder mainbuilder(input.c_str(), options.debug); linker.linkObject(mainbuilder); - // In the future, there will be code to open additional files/buffers and - // link additional objects, as well as archive members (which only get linked if needed), e.g.: - // S2WasmBuilder lazyObject(some_other_buffer, options.debug) - // linker.linkLazyObject(lazyObject); // calls builder.scan to get symbol info, then build + for (const auto& m : archiveLibraries) { + auto archiveFile(read_file<std::vector<char>>(m, Flags::Binary, debugFlag)); + bool error; + Archive lib(archiveFile, error); + if (error) Fatal() << "Error opening archive " << m << "\n"; + linker.linkArchive(lib); + } linker.layout(); |