将Lua移植到SGX应用:Luacpp集成编译错误及静态化需求
问题解决指南
一、链接错误的解决方法
你遇到的undefined reference和vtable错误,核心原因是Enclave未正确链接到Luacpp和Lua的静态库,或库的编译方式不符合SGX要求:
重新编译Luacpp为静态库
SGX Enclave仅支持链接静态库,因此必须确保Luacpp以静态库形式编译。若之前安装的是动态库,重新编译步骤如下:rm -rf build && mkdir build && cd build cmake -DBUILD_SHARED_LIBS=OFF .. make && sudo make install执行后会生成
libLuaCpp.a静态库,默认安装到/usr/local/lib目录。调整Enclave Makefile配置
在SampleEnclave的Makefile中,找到Enclave编译相关变量,进行如下修改:- 在
ENCLAVE_CFLAGS中添加Luacpp的头文件路径:ENCLAVE_CFLAGS += -I/usr/local/include - 在
ENCLAVE_LDFLAGS或ENCLAVE_LIBS中添加静态库链接参数(注意依赖顺序,Lua库需放在Luacpp之后):ENCLAVE_LDFLAGS += -L/usr/local/lib -lLuaCpp -llua
- 在
保证编译器ABI兼容
SGX Enclave使用Intel专用的Clang系编译器,需确保Luacpp和Lua用同一编译器编译,避免ABI不兼容导致vtable错误:- 编译Lua时指定SGX编译器:
make CC=/opt/intel/sgxsdk/bin/x86_64-linux-gnu-gcc static - 编译Luacpp时指定cmake编译器:
cmake -DCMAKE_C_COMPILER=/opt/intel/sgxsdk/bin/x86_64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=/opt/intel/sgxsdk/bin/x86_64-linux-gnu-g++ -DBUILD_SHARED_LIBS=OFF ..
- 编译Lua时指定SGX编译器:
二、消除Lua动态库依赖的可行性
完全可以实现,SGX本身要求Enclave内禁止使用动态库,只需将Lua和Luacpp均静态编译并链接到Enclave即可:
- 编译Lua静态库:下载Lua官方源码,执行
make static(或用SGX编译器编译),生成liblua.a静态库。 - 编译Luacpp静态库:按上述步骤编译为静态库并链接Lua静态库,使Luacpp静态库包含Lua依赖。
- 链接到Enclave:在Enclave Makefile中同时链接Luacpp和Lua的静态库,最终生成的
enclave.so会包含所有依赖代码,无动态库依赖。
另外,DWARF错误属于调试信息问题,若无需调试,可在Makefile中关闭调试选项(移除-g参数),或确保编译器生成的调试信息符合SGX链接器要求。
内容的提问来源于stack exchange,提问作者taserghar
相关产品推荐
相关产品推荐

