summaryrefslogtreecommitdiff
path: root/src/s2wasm-main.cpp
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@chromium.org>2016-05-05 08:01:57 -0700
committerDerek Schuff <dschuff@chromium.org>2016-05-05 08:01:57 -0700
commit2811727a118e92e6b7ef293458f9bab1cf5dacdc (patch)
treead18967b67f3596b28f3013ad6f05cc269d126c6 /src/s2wasm-main.cpp
parent1397997bc91663f19c387c69c7e47930efe57539 (diff)
downloadbinaryen-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.cpp20
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();