2016-12-14 81 views
1

我將使用Duktape進行ARM 32/64平臺的JavaScript評估。 我只想爲特定平臺&構建Duktape,而不是針對所有範圍。針對特定平臺構建Duktape(ARM 32/ARM 64)

看來,我能成功建立它:

python tools/configure.py \ 
    --source-directory src-input \ 
    --platform linux \ 
    --architecture arm32 \ 
    --config-metadata config/ \ 
    --option-file arm32_config.yaml \ 
    --output-directory /tmp/arm32  

arm32_config.yaml

DUK_USE_32BIT_PTRS: true 
DUK_USE_64BIT_OPS: false 
DUK_USE_FATAL_HANDLER: false 

構建通usually.That的偉大!

在樹莓派(使用它只是爲了測試):

我有一個hello.c的

#include "duktape.h" 

int main(int argc, char *argv[]) { 
    duk_context *ctx = duk_create_heap_default(); 
    duk_eval_string(ctx, "print('Hello world!');"); 
    duk_destroy_heap(ctx); 
    return 0; 
} 

Makefile.hello文件:

DUKTAPE_SOURCES = src/arm32/duktape.c 

# Compiler options are quite flexible. GCC versions have a significant impact 
# on the size of -Os code, e.g. gcc-4.6 is much worse than gcc-4.5. 

CC = gcc 
CCOPTS = -Os -pedantic -std=c99 -Wall -fstrict-aliasing -fomit-frame-pointer 
CCOPTS += -I./src/arm32 # for combined sources 
CCLIBS = -lm 
CCOPTS += -DUK_USE_32BIT_PTRS 
CCOPTS += -DUK_USE_64BIT_OPS 
CCOPTS += -DUK_USE_FATAL_HANDLER 

# For debugging, use -O0 -g -ggdb, and don't add -fomit-frame-pointer 

hello: $(DUKTAPE_SOURCES) hello.c 
    $(CC) -o [email protected] $(DEFINES) $(CCOPTS) $(DUKTAPE_SOURCES) hello.c $(CCLIBS) 

它也有效!

但是,當我試圖啓動程序./hello我一直recived: 分段故障

能否請您對我的錯誤,指出有什麼我錯過了什麼? 提前謝謝!

PS:gcc版本4.9.2(Raspbian 4.9.2-10)

回答

1

你最有可能遇到的主要問題是,你從Duktape主的工作(這將成爲2.0.0版本)它不再提供內置的「print()」綁定。這會導致錯誤被拋出。

該錯誤未被捕獲,因爲您沒有受保護的調用來包裝eval調用,因此發生致命錯誤。既然你沒有提供致命的錯誤處理程序(在duk_create_heap()或通過DUK_USE_FATAL_HANDLER),導致默認的致命錯誤行爲導致故意的段錯誤(這是爲了使調試器可以連接)。

所以最簡單的解決方法是定義一個print()綁定,併爲eval添加一個致命的錯誤處理程序和/或受保護的調用。下面是添加打印()結合(做EVAL之前)的例子:

static duk_ret_t native_print(duk_context *ctx) { 
    duk_push_string(ctx, " "); 
    duk_insert(ctx, 0); 
    duk_join(ctx, duk_get_top(ctx) - 1); 
    printf("%s\n", duk_safe_to_string(ctx, -1)); 
    return 0; 
} 

/* ... before doing eval(): */ 
duk_push_c_function(ctx, native_print, DUK_VARARGS); 
duk_put_global_string(ctx, "print"); 

其他一些小意見:

  • Duktape duk_config.h檢測平臺和目標您正在爲;就所得到的二元數據而言,Duktape從來沒有真正構建過「針對所有目標」。因此,在duk_config.h中有多個平臺不會使結果更大。
  • 你不應該需要你的arm32_config.yaml中的值。應該自動檢測ARM32。
  • 您使用的Makefile.hello來自Duktape 1.x(改編),而您編譯的代碼來自Duktape master。CCOPTS選項將被Duktape master忽略(它們會進入tools/configure.py),並且它們的格式在示例中是錯誤的,例如, -DUK_USE_FATAL_HANDLER定義了預處理器值UK_USE_FATAL_HANDLER
+0

非常感謝您的詳細澄清! –

+0

如果我需要優化duktape低內存設備該怎麼辦?我以爲我需要在'config.yaml'的編譯步驟中完成它。 ' DUK_USE_JX:假 DUK_USE_DEBUG_BUFSIZE:1024 .... ' 是否仍然有效? –

+0

有很多低內存選項,在https://github.com/svaarala/duktape/blob/master/doc/low-memory.rst中描述(太多以在此列出)。低內存選項通常會取捨某些東西(性能或功能)以獲得足跡,因此最佳選擇取決於特定的目標應用程序。使用例如'DUK_USE_LIGHTFUNC_BUILTINS:false','DUK_USE_JX:false'都是減少佔位面積的可能步驟。 –