【问题标题】:NSPR emscripten compile assembly file '*.s'NSPR emscripten 编译程序集文件'*.s'
【发布时间】:2018-12-12 02:16:55
【问题描述】:

在用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

可是,《万灵》出来了,

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

我在静态库“libnspr4.a”中使用了“emar”,它可以工作。

但是 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 函数”链接

我需要你的评论。谢谢


另外,

命令“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

【问题讨论】:

    标签: emscripten


    【解决方案1】:

    当然不会。

    WebAssembly 本身是一个目标平台,这意味着它相当于 Web 中的组装。编译器永远不会将原生 x86 汇编代码 (.s) 转换为另一个目标平台。

    我不认为将像 NSPR 这样的低级系统库编译到 WebAssembly 是一个好主意,因为 WebAssembly 目前没有诸如 pthread 之类的系统功能(好吧,Chrome 支持它,但它仍然是实验性功能并被禁用默认)。

    说到 clang,你应该设置一个编译器标志 --target=wasm32-unknown-unknown-wasm 以便将其编译为 WebAssembly。 Cloudflare 有 a good example 关于如何将 clang 用于 WebAssembly。

    【讨论】:

    • 非常感谢您的回复。不幸的是,NSPR 没有“os_Linux_x86.c”而是“os_Linux_x86.s”。我需要制作一个与“os_Linux_x86.s”链接的静态库“libnspr4.a”。它说“os_Linux_x86.o 不是 LLVM 位码,无法链接”。难道不能把“os_Linux_x86.s”编译成“os_Linux_x86.o”吗?
    • @MarcoJo 我不熟悉 NSPR,但可能有针对 x86 以外的平台的纯 C/C++ 实现。只要在链接器阶段.a 中有本机 ASM 代码,Emscripten 就会始终抛出错误。如果必须使用 ASM 文件 .s,您别无选择,只能使用将 ASM 文件转换为 C 源代码的反汇编程序,或者将这些部分重写为 C。
    • 出于好奇,为什么在浏览器中需要 NSPR?可能还有其他选择...
    • 很抱歉我不能告诉你为什么我需要这样做。但我需要:(我会尝试拆卸。谢谢Bumsik。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多