NSPR emscripten 编译汇编文件'*.s'
NSPR emscripten compile assembly file '*.s'
在用emscripten编译NSPR时遇到问题
emscripten 不知道“.s”后缀,并发出类似
的错误
shared:ERROR: os_Linux_x86.s: Input file has an unknown suffix, don't know what to do with it!
或者,我用 "clang"
编译了文件
/Users/xxxxxx/Documents/workspaces/EMC/emsdk/clang/e1.38.20_64bit/clang -o os_Linux_x86.o -Wall -pthread -g -fno-inline -fPIC -UNDEBUG -DDEBUG_xxxxxx -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DDEBUG=1 -DXP_UNIX=1 -D_GNU_SOURCE=1 -DHAVE_FCNTL_FILE_LOCKING=1 -DHAVE_POINTER_LOCALTIME_R=1 -DLINUX=1 -DHAVE_DLADDR=1 -DHAVE_LCHOWN=1 -DHAVE_SETPRIORITY=1 -DHAVE_STRERROR=1 -D_REENTRANT=1 -DFORCE_PR_LOG -D_PR_PTHREADS -UHAVE_CVAR_BUILT_ON_SEM -D_NSPR_BUILD_ -I../../../../dist/include/nspr -I../../../../pr/include -I../../../../pr/include/private -c os_Linux_x86.s
但是,"Wanring"出来了,
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_cQDqqw_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
llvm-nm 上的输出文件就像
0000000000000050 T _PR_x86_AtomicAdd
0000000000000020 T _PR_x86_AtomicDecrement
0000000000000000 T _PR_x86_AtomicIncrement
0000000000000040 T _PR_x86_AtomicSet
并且我已经将 "emar" 用于静态库 "libnspr4.a",并且它有效。
但是
bash-3.2$ /Users/xxxxxx/Documents/workspaces/EMC/emsdk/emscripten/1.38.20/emcc -D__i386__ -D_PR_POLL_AVAILABLE abstract.o -Xlinker -L../../dist/lib -lplc4 -L../../dist/lib -lnspr4 -lpthread -o abstract.js
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_HXB1yC_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_HXB1yC_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_HXB1yC_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
error: undefined symbol: _PR_x86_AtomicDecrement
warning: To disable errors for undefined symbols use
-s ERROR_ON_UNDEFINED_SYMBOLS=0
error: undefined symbol: _PR_x86_AtomicIncrement
error: undefined symbol: _PR_x86_AtomicSet
error: undefined symbol: pthread_attr_getschedparam
error: undefined symbol: pthread_attr_setinheritsched
error: undefined symbol: pthread_attr_setscope
error: undefined symbol: sched_get_priority_max
error: undefined symbol: sched_get_priority_min
error: undefined symbol: sendfile
Error: Aborting compilation due to previous errors
shared:ERROR: '/Users/xxxxxx/Documents/workspaces/EMC/emsdk/node/8.9.1_64bit/bin/node /Users/xxxxxx/Documents/workspaces/EMC/emsdk/emscripten/1.38.20/src/compiler.js /tmp/tmpAycNjj.txt /Users/xxxxxx/Documents/workspaces/EMC/emsdk/emscripten/1.38.20/src/library_pthread_stub.js' failed (1)
我猜输出静态库没有链接 "os_Linux_x86 functions"
我需要你的评论。谢谢
此外,
命令"llvm-nm libnspr4.a"显示
U __errno_location
U _pr_CopyLowBits
-------- d coOpenDevURandom
-------- d fdDevURandom
U gettimeofday
U open
U read
uxshm_568a7427.o:
U PR_Assert
U PR_Calloc
U PR_Close
U PR_CreateFileMap
U PR_Free
U PR_GetCurrentThread
U PR_GetOSError
U PR_GetOpenFileInfo64
U PR_ImportFile
U PR_LogPrint
U PR_Malloc
U PR_SetError
U PR_smprintf
U PR_smprintf_free
U PR_snprintf
U PR_sscanf
-------- T _MD_AttachSharedMemory
-------- T _MD_CloseSharedMemory
-------- T _MD_DeleteSharedMemory
-------- T _MD_DetachSharedMemory
-------- T _MD_OpenSharedMemory
U _MD_unix_map_close_error
U _MD_unix_map_default_error
U _MD_unix_map_open_error
U _MD_unix_map_unlink_error
U _PR_MakeNativeIPCName
U __errno_location
-------- T _md_ExportFileMapAsString
-------- T _md_ImportFileMapFromString
-------- T _md_OpenAnonFileMap
U _pr_shm_lm
U _pr_shma_lm
U close
U ftok
U ftruncate
U getpid
U open
U shmat
U shmctl
U shmdt
U shmget
U strcpy
U strlen
U unlink
uxwrap_0bf9337c.o:
linux_b243132c.o:
-------- T _MD_CleanupBeforeExit
-------- T _MD_EarlyInit
-------- T _MD_HomeGCRegisters
U _MD_unix_terminate_waitpid_daemon
libnspr4.a(os_Linux_x86_f787044a.o):
0000000000000050 T _PR_x86_AtomicAdd
0000000000000020 T _PR_x86_AtomicDecrement
0000000000000000 T _PR_x86_AtomicIncrement
0000000000000040 T _PR_x86_AtomicSet
当然不会。
WebAssembly本身就是一个目标平台,相当于web中的assembly。编译器永远不会将本机 x86 汇编代码 (.s
) 转换为另一个目标平台。
我不认为将像 NSPR 这样的低级系统库编译到 WebAssembly 是个好主意,因为 WebAssembly 目前没有系统功能,例如 pthread(好吧,Chrome 支持它,但它是但实验性功能,默认情况下禁用)。
说到 clang,您应该设置编译器标志 --target=wasm32-unknown-unknown-wasm
以便将其编译为 WebAssembly。 Cloudflare a good example 关于如何将 clang 用于 WebAssembly。
在用emscripten编译NSPR时遇到问题
emscripten 不知道“.s”后缀,并发出类似
的错误shared:ERROR: os_Linux_x86.s: Input file has an unknown suffix, don't know what to do with it!
或者,我用 "clang"
编译了文件/Users/xxxxxx/Documents/workspaces/EMC/emsdk/clang/e1.38.20_64bit/clang -o os_Linux_x86.o -Wall -pthread -g -fno-inline -fPIC -UNDEBUG -DDEBUG_xxxxxx -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DDEBUG=1 -DXP_UNIX=1 -D_GNU_SOURCE=1 -DHAVE_FCNTL_FILE_LOCKING=1 -DHAVE_POINTER_LOCALTIME_R=1 -DLINUX=1 -DHAVE_DLADDR=1 -DHAVE_LCHOWN=1 -DHAVE_SETPRIORITY=1 -DHAVE_STRERROR=1 -D_REENTRANT=1 -DFORCE_PR_LOG -D_PR_PTHREADS -UHAVE_CVAR_BUILT_ON_SEM -D_NSPR_BUILD_ -I../../../../dist/include/nspr -I../../../../pr/include -I../../../../pr/include/private -c os_Linux_x86.s
但是,"Wanring"出来了,
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_cQDqqw_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
llvm-nm 上的输出文件就像
0000000000000050 T _PR_x86_AtomicAdd
0000000000000020 T _PR_x86_AtomicDecrement
0000000000000000 T _PR_x86_AtomicIncrement
0000000000000040 T _PR_x86_AtomicSet
并且我已经将 "emar" 用于静态库 "libnspr4.a",并且它有效。
但是
bash-3.2$ /Users/xxxxxx/Documents/workspaces/EMC/emsdk/emscripten/1.38.20/emcc -D__i386__ -D_PR_POLL_AVAILABLE abstract.o -Xlinker -L../../dist/lib -lplc4 -L../../dist/lib -lnspr4 -lpthread -o abstract.js
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_HXB1yC_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_HXB1yC_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
shared:WARNING: object /var/folders/6d/cn41t4b56b725ych8k101yd80000gn/T/emscripten_temp_HXB1yC_archive_contents/os_Linux_x86_f787044a.o is not LLVM bitcode, cannot link
error: undefined symbol: _PR_x86_AtomicDecrement
warning: To disable errors for undefined symbols use
-s ERROR_ON_UNDEFINED_SYMBOLS=0
error: undefined symbol: _PR_x86_AtomicIncrement
error: undefined symbol: _PR_x86_AtomicSet
error: undefined symbol: pthread_attr_getschedparam
error: undefined symbol: pthread_attr_setinheritsched
error: undefined symbol: pthread_attr_setscope
error: undefined symbol: sched_get_priority_max
error: undefined symbol: sched_get_priority_min
error: undefined symbol: sendfile
Error: Aborting compilation due to previous errors
shared:ERROR: '/Users/xxxxxx/Documents/workspaces/EMC/emsdk/node/8.9.1_64bit/bin/node /Users/xxxxxx/Documents/workspaces/EMC/emsdk/emscripten/1.38.20/src/compiler.js /tmp/tmpAycNjj.txt /Users/xxxxxx/Documents/workspaces/EMC/emsdk/emscripten/1.38.20/src/library_pthread_stub.js' failed (1)
我猜输出静态库没有链接 "os_Linux_x86 functions"
我需要你的评论。谢谢
此外,
命令"llvm-nm libnspr4.a"显示
U __errno_location
U _pr_CopyLowBits
-------- d coOpenDevURandom
-------- d fdDevURandom
U gettimeofday
U open
U read
uxshm_568a7427.o:
U PR_Assert
U PR_Calloc
U PR_Close
U PR_CreateFileMap
U PR_Free
U PR_GetCurrentThread
U PR_GetOSError
U PR_GetOpenFileInfo64
U PR_ImportFile
U PR_LogPrint
U PR_Malloc
U PR_SetError
U PR_smprintf
U PR_smprintf_free
U PR_snprintf
U PR_sscanf
-------- T _MD_AttachSharedMemory
-------- T _MD_CloseSharedMemory
-------- T _MD_DeleteSharedMemory
-------- T _MD_DetachSharedMemory
-------- T _MD_OpenSharedMemory
U _MD_unix_map_close_error
U _MD_unix_map_default_error
U _MD_unix_map_open_error
U _MD_unix_map_unlink_error
U _PR_MakeNativeIPCName
U __errno_location
-------- T _md_ExportFileMapAsString
-------- T _md_ImportFileMapFromString
-------- T _md_OpenAnonFileMap
U _pr_shm_lm
U _pr_shma_lm
U close
U ftok
U ftruncate
U getpid
U open
U shmat
U shmctl
U shmdt
U shmget
U strcpy
U strlen
U unlink
uxwrap_0bf9337c.o:
linux_b243132c.o:
-------- T _MD_CleanupBeforeExit
-------- T _MD_EarlyInit
-------- T _MD_HomeGCRegisters
U _MD_unix_terminate_waitpid_daemon
libnspr4.a(os_Linux_x86_f787044a.o):
0000000000000050 T _PR_x86_AtomicAdd
0000000000000020 T _PR_x86_AtomicDecrement
0000000000000000 T _PR_x86_AtomicIncrement
0000000000000040 T _PR_x86_AtomicSet
当然不会。
WebAssembly本身就是一个目标平台,相当于web中的assembly。编译器永远不会将本机 x86 汇编代码 (.s
) 转换为另一个目标平台。
我不认为将像 NSPR 这样的低级系统库编译到 WebAssembly 是个好主意,因为 WebAssembly 目前没有系统功能,例如 pthread(好吧,Chrome 支持它,但它是但实验性功能,默认情况下禁用)。
说到 clang,您应该设置编译器标志 --target=wasm32-unknown-unknown-wasm
以便将其编译为 WebAssembly。 Cloudflare a good example 关于如何将 clang 用于 WebAssembly。