2017-06-03 18 views
9

下面的C文件編譯emscripten到WASM:WebAssembly鏈接錯誤:導入對象場 'DYNAMICTOP_PTR' 不是一個數量

int counter = 100; 

int count() { 
    counter += 1; 
    return counter; 
} 
$ emcc counter.c -o counter.wasm -s WASM=1 -s SIDE_MODULE=1 

沒有問題。然後,我已經的WebPack加載WASM文件(wasm-loader)作爲UInt8Array:

var buffer = new ArrayBuffer(648); 
var uint8 = new Uint8Array(buffer); 
uint8.set([0,97,115,109,1,0,0,0,0,12,6,100,121,108,105,110,107,144,128,192,2,0,1,150,128,128,128,0,5,96,1,127,0,96,1,127,1,127,96,0,1,127,96,2,127,127,0,96,0,0,2,179,129,128,128,0,10,3,101,110,118,14,68,89,78,65,77,73,67,84,79,80,95,80,84,82,3,127,0,3,101,110,118,13,116,101,109,112,68,111,117,98,108,101,80,116,114,3,127,0,3,101,110,118,5,65,66,79,82,84,3,127,0,3,101,110,118,10,109,101,109,111,114,121,66,97,115,101,3,127,0,3,101,110,118,9,116,97,98,108,101,66,97,115,101,3,127,0,6,103,108,111,98,97,108,3,78,97,78,3,124,0,6,103,108,111,98,97,108,8,73,110,102,105,110,105,116,121,3,124,0,3,101,110,118,18,97,98,111,114,116,83,116,97,99,107,79,118,101,114,102,108,111,119,0,0,3,101,110,118,6,109,101,109,111,114,121,2,0,128,2,3,101,110,118,5,116,97,98,108,101,1,112,0,0,3,137,128,128,128,0,8,1,2,0,3,3,2,4,4,6,242,128,128,128,0,20,127,1,35,0,11,127,1,35,1,11,127,1,35,2,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,124,1,35,5,11,124,1,35,6,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,124,1,68,0,0,0,0,0,0,0,0,11,127,1,65,0,11,125,1,67,0,0,0,0,11,125,1,67,0,0,0,0,11,127,0,65,0,11,7,184,128,128,128,0,4,6,95,99,111,117,110,116,0,6,18,95,95,112,111,115,116,95,105,110,115,116,97,110,116,105,97,116,101,0,8,11,114,117,110,80,111,115,116,83,101,116,115,0,7,8,95,99,111,117,110,116,101,114,3,26,9,129,128,128,128,0,0,10,190,129,128,128,0,8,173,128,128,128,0,1,1,127,2,64,35,10,33,1,35,10,32,0,106,36,10,35,10,65,15,106,65,112,113,36,10,35,10,35,11,78,4,64,32,0,16,0,11,32,1,15,0,11,0,11,133,128,128,128,0,0,35,10,15,11,134,128,128,128,0,0,32,0,36,10,11,141,128,128,128,0,0,2,64,32,0,36,10,32,1,36,11,11,11,146,128,128,128,0,0,35,12,65,0,70,4,64,32,0,36,12,32,1,36,13,11,11,161,128,128,128,0,1,4,127,2,64,35,10,33,3,35,3,65,0,106,40,2,0,33,0,32,0,65,1,106,33,1,32,1,15,0,11,0,11,133,128,128,128,0,1,1,127,1,11,152,128,128,128,0,0,2,64,35,3,65,16,106,36,10,35,10,65,128,128,192,2,106,36,11,16,7,11,11,11,135,128,128,128,0,1,0,35,3,11,1,100,]); 

我的JS代碼,然後調用如下

import Counter from './wasm/counter' 
const counter = new Counter(); 

上卻失敗,出現以下錯誤的實例:

LinkError: import object field 'DYNAMICTOP_PTR' is not a Number 

WASM裝載機使用以下默認選項(importObject)爲WebAssembly.Instance(module, importObject)

{ 
    'global': {}, 
    'env': { 
    'memory': new Memory({initial: 10, limit: 100}), 
    'table': new Table({initial: 0, element: 'anyfunc'}) 
    } 
} 

我做錯了什麼?我如何成功加載wasm代碼?

編輯: 繼@Ghillie意見,我試圖編譯不同的優化標誌的C代碼:

-O1-02-O3-Os-Oz拋出一個LinkError: import object field 'memoryBase' is not a Number這是一個不同的錯誤,但不解決問題。

編輯2:

獨資加入-O1優化標誌沒有工作,但有允許調試代碼不同的錯誤信息,這樣@G​​hillie和我的答案都提供了我的問題的完整解決方案。

回答

8

使用除缺省-O0以外的任何優化標誌進行編譯。例如:

emcc counter.c -O1 -o counter.wasm -s WASM=1 -s SIDE_MODULE=1

的各種優化參數在這裏列出:

https://kripken.github.io/emscripten-site/docs/optimizing/Optimizing-Code.html

+0

感謝您的建議,但不幸的是它不起作用,請參閱我的編輯的細節。 –

+0

事實上,它有助於讓不同的LinkError允許我調試代碼,參見參考資料。我的回答,謝謝! :) –

5

的解決方案似乎是扭捏importObject用於WebAssembly.Instance(module, importObject)

{ 
    'env': { 
    'memoryBase': 0, 
    'tableBase': 0, 
    'memory': new WebAssembly.Memory({initial: 256}), 
    'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'}) 
    } 
} 

memoryBasetableBase需要和初始記憶值太低(投出LinkedError: Memory of incompatible size)。

此外,一旦實例化完成,我不得不打電話counter.exports._count()而不是counter.exports.count()

也感謝@Ghillie作爲-O1確實需要優化標誌。

編輯:如果你正在讀這篇文章,剛開始接觸WebAssembly,我做我的第一個經驗的總結,在情況下,它可以幫助:WebAssembly 101: a developer's first steps

+2

'memoryBase'和'tableVase'是必需的,因爲你正在編譯爲一個側面模塊。如果你還沒有看到它,你可以閱讀更多[這裏](https://github.com/WebAssembly/tool-conventions/blob/master/DynamicLinking.md)。 – Ghillie

+0

好的,謝謝你在鏈接文檔中的解釋! –

相關問題