From 8999e0e20212d736b539f15debad25a69dda2f98 Mon Sep 17 00:00:00 2001 From: Nick Bray Date: Wed, 7 Aug 2013 12:39:33 -0700 Subject: Ensure the linker pulls in static libraries containing exported functions. Previously, an exported function contained in a library would not be found by the linker if the library did not contain symbols transitively reachable from main. --- tests/runner.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'tests') diff --git a/tests/runner.py b/tests/runner.py index 84e8b69e..86ae5bdb 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -11595,6 +11595,39 @@ int main(int argc, char const *argv[]) self.assertContained('a\nb\n', run_js(os.path.join(self.get_dir(), 'a.out.js'))) + def test_export_in_a(self): + export_name = 'this_is_an_entry_point' + + open('export.c', 'w').write(r''' + #include + void %s(void) { + printf("Hello, world!\n"); + } + ''' % export_name) + Popen([PYTHON, EMCC, 'export.c', '-c', '-o', 'export.o']).communicate() + Popen([PYTHON, EMAR, 'rc', 'libexport.a', 'export.o']).communicate() + + open('main.c', 'w').write(r''' + int main() { + return 0; + } + ''') + + definition = 'function _%s(' % export_name + + # Sanity check: the symbol should not be linked in if not requested. + Popen([PYTHON, EMCC, 'main.c', '-L.', '-lexport']).communicate() + self.assertNotContained(definition, open(os.path.join(self.get_dir(), 'a.out.js')).read()) + + # Sanity check: exporting without a definition does not cause it to appear. + # Note: exporting main prevents emcc from warning that it generated no code. + Popen([PYTHON, EMCC, 'main.c', '-s', '''EXPORTED_FUNCTIONS=['_main', '_%s']''' % export_name]).communicate() + self.assertNotContained(definition, open(os.path.join(self.get_dir(), 'a.out.js')).read()) + + # Actual test: defining symbol in library and exporting it causes it to appear in the output. + Popen([PYTHON, EMCC, 'main.c', '-L.', '-lexport', '-s', '''EXPORTED_FUNCTIONS=['_%s']''' % export_name]).communicate() + self.assertContained(definition, open(os.path.join(self.get_dir(), 'a.out.js')).read()) + def test_embed_file(self): open(os.path.join(self.get_dir(), 'somefile.txt'), 'w').write('''hello from a file with lots of data and stuff in it thank you very much''') open(os.path.join(self.get_dir(), 'main.cpp'), 'w').write(r''' -- cgit v1.2.3-18-g5258