WebAssembly night #10 イベント: https://emsn.connpass.com/event/192221/ 自作したWasmリンカ: https://github.com/kateinoigakukun/chibi-link
WasmϦϯΧͷͭ͘Γ͔ͨ@kateinoigakukunWebAssembly Night #101
View Slide
ࣗݾհ@kateinoigakukun• Πϯλʔϯ at ϝϧϖΠ ΤΩεύʔτνʔϜ• SwiftͷWebAssemblyରԠͳͲ• ڵຯ: ݴޠॲཧܥ, Swift2
ϦϯΧΛ࡞ΔϞνϕʔγϣϯ3
SwiftWasmϓϩδΣΫτhttps://swiftwasm.orgSwiftLLVMΛϑΥʔΫͯ͠SwiftͷWebAssemblyରԠΛਐΊΔϓϩδΣΫτɻπʔϧνΣʔϯͷJavaScriptͱͷ࿈ܞϥΠϒϥϦͷ։ൃͳͲͬͯΔɻ4
ϒϥβͰࢼͤ·͢ https://pad.swiftwasm.org/5
ҎલͷSwiftWasm PadͷΞʔΩςΫνϟ6
• Swiftͷඪ४ϥΠϒϥϦαΠζ͕େ͖͍• αʔόͰඪ४ϥΠϒϥϦ͕ϦϯΫ͞Ε͍ͯΔͷͰμϯϩʔυαΠζ͕େ͖͘ͳΔ7
ݱࡏͷSwiftWasm PadͷΞʔΩςΫνϟ8
WasmͷಈతϦϯΫٞWebAssembly/module-linking ͰਐΜͰ͍Δ͕ɺStableͳAPI·ͩແ͍ɻEmscriptenͰಈతϦϯΫͰ͖ΔΒ͍͕͠SwiftLLVMͷWasmόοΫΤϯυΛ͍ͬͯΔͷͰͦͷ··͑ͳ͍ɻ9
ϒϥβͰಈ͘WasmϦϯΧΛ࡞Ζ͏ʂ10
WebAssemblyͷϦϯΧࣄ• ίϯύΠϥͱϦϯΧͷؒʹඪ४ͷ༷͕ແ͍1• ΦϒδΣΫτϑΝΠϧͷϑΥʔϚοτͳͲ• πʔϧνΣʔϯ͝ͱʹίϯϕϯγϣϯ͕͋Δ• lld (wasm-ld)͕LLVMͷίϯϕϯγϣϯΛຬͨ͢།Ұͷ࣮ʢଞʹ͋Εڭ͑ͯԼ͍͞ʣ1 ҰԠυΩϡϝϯτ͋Δ https://github.com/WebAssembly/tool-conventions/blob/master/Linking.md11
ϦϯΧͷࣄ• ಉ͡ηΫγϣϯΛϚʔδ• γϯϘϧͷղܾ• ࠶ஔ12
ಉ͡ηΫγϣϯΛϚʔδ• ࣈͷ͝ͱ͘Ϛʔδ͢Δ• ϦϯΧ͕ੜ͢ΔؔσʔλྖҬ͓ࠞͥͯ͘• ελοΫྖҬ(__stack_pointer)• ίϯετϥΫλ(__wasm_call_ctors)13
γϯϘϧͷղܾ// lib.cint add(int a, int b) {return a + b;}// main.cint add(int a, int b);int main(void) {return add(1, -1);}14
࠶ஔ࠶ஔϨίʔυͱγϯϘϧςʔϒϧΛݩʹϦϯΫޙͷγϯϘϧͷΞυϨεΛॻ͖ࠐΉ// main.cint add(int a, int b);int main(void) {return add(1, -1); // addؔͷϦϯΫޙͷΞυϨεΛΓ͍ͨ}15
$ wasm-objdump --details --section=reloc.CODE main.omain.o: file format wasm 0x1Section Details:Custom:- name: "reloc.CODE"- relocations for section: 3 (Code) [5]- R_WASM_GLOBAL_INDEX_LEB offset=0x000006(file=0x00008f) symbol=1 - R_WASM_GLOBAL_INDEX_LEB offset=0x00001b(file=0x0000a4) symbol=1 - R_WASM_FUNCTION_INDEX_LEB offset=0x000038(file=0x0000c1) symbol=2 - R_WASM_GLOBAL_INDEX_LEB offset=0x00004d(file=0x0000d6) symbol=1 - R_WASM_FUNCTION_INDEX_LEB offset=0x00005b(file=0x0000e4) symbol=0 <__original_main>16
kateinoigakukun/chibi-link• ࠓճ࡞ͬͨSwiftWasmϦϯΧ• SwiftΛϦϯΫ͢Δͷʹ࠷খݶͳػೳ• ϦϯΧຊମ3000ߦ͘Β͍Ͱখ͞Ί$ wasmtime run --mapdir=/var/tmp::$(pwd) chibi-link.wasm -- \/var/tmp/lib.o /var/tmp/main.o -o /var/tmp/output.wasm17
͕͜͜ਏ͍ΑϦϯΧ։ൃ• ίϯύΠϥͱϦϯΧͷࡉʑͨ͠ଋ͕໌จԽ͞Ε͍ͯͳ͍• σʔληάϝϯτͷ։࢝ͱऴΘΓͷΞυϨεΛ__start_/__stop_{{segment_name}}ͷγϯϘϧͰެ։͠ͳ͍ͱ͍͚ͳ͍• ؔςʔϒϧͷ0൪τϥοϓͷͨΊʹ֬อ͢Δ• etc...• σόοά͕େม• ϦϯΫ݁Ռ͕յΕ͍ͯΔͱɺϝϞϦΛഁյ͠ͳ͕Βಈ͍ͪΌ͏18
·ͱΊ• ΫϥΠΞϯταΠυϦϯΧ͕https://pad.swiftwasm.org/ ͰΘΕͯΔ• ϦϯΧͷΔ͜ͱҙ֎ͱগͳ͍• Wasm༷͕·ͩখ͍͞ͷͰϦϯΧΛॻ͘ͷʹ͓͢͢Ίʂ19