2016-02-13 16 views
0

首次海报,很长一段时间的风扇......(PPC64le)节点GYP重建链接到protobuf的一个模块失败,“缺乏NOP,不能恢复TOC;用-fPIC编译”

我m试图在RHEL 7.1上为ppc64le(little endian)重建一个节点模块,并得到以下令人困惑的输出。我在x64 vm上完成了相同的步骤,并且一切正常。

部分输出在下面,即使它说用-fPIC编译,该选项已经在g ++命令中输出,如输出中所示,所以我不知道该怎么处理这个错误。

而且即使它看起来在Linux-x64的目录静态的protobuf库:../sdk/protobuf/2.5.0/linux-x64/libprotobuf.a

我更换了目录的内容从epel repo的protobuf-static-2.5.0-7.el7.ppc64le rpm中为ppc64le编译库。所以库应该没问题,它们与节点模块预期的版本相同

那么这个错误是什么意思?我怎么能通过它?我使用的相同步骤在linux-x64中工作正常。我能想到的主要区别是我必须为protobuf-static-2.5.0-7.el7.ppc64le包中的ppc64le引入一些静态库(protobuf.a)。这些链接到我正在gyp'ng的节点模块中。下面是'node-gyp rebuild --verbose'的输出:

在此先感谢!

gyp info spawn args '-Goutput_dir=.' ] 
gyp verb command build [] 
gyp verb build type Release 
gyp verb architecture ppc64 
gyp verb node dev dir /root/.node-gyp/4.2.6 
gyp verb `which` succeeded for `make` /usr/bin/make 
gyp info spawn make 
gyp info spawn args [ 'V=1', 'BUILDTYPE=Release', '-C', 'build' ] 
make: Entering directory `/root/nodejs/napp1/node_modules/mynodemod/node_modules/mynodemod-protobuf/build' 
    g++ '-DNODE_GYP_MODULE_NAME=protobuf_for_node' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/root/.node-gyp/4.2.6/include/node -I/root/.node-gyp/4.2.6/src -I/root/.node-gyp/4.2.6/deps/uv/include -I/root/. 
node-gyp/4.2.6/deps/v8/include -I../../nan -I../sdk/protobuf/2.5.0/include -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -mminimal-toc -O3 -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fno-rtti -fno-exceptions -s 
td=gnu++0x -MMD -MF ./Release/.deps/Release/obj.target/protobuf_for_node/protobuf_for_node.o.d.raw -c -o Release/obj.target/protobuf_for_node/protobuf_for_node.o ../protobuf_for_node.cc 
    g++ '-DNODE_GYP_MODULE_NAME=protobuf_for_node' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/root/.node-gyp/4.2.6/include/node -I/root/.node-gyp/4.2.6/src -I/root/.node-gyp/4.2.6/deps/uv/include -I/root/. 
node-gyp/4.2.6/deps/v8/include -I../../nan -I../sdk/protobuf/2.5.0/include -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -mminimal-toc -O3 -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fno-rtti -fno-exceptions -s 
td=gnu++0x -MMD -MF ./Release/.deps/Release/obj.target/protobuf_for_node/addon.o.d.raw -c -o Release/obj.target/protobuf_for_node/addon.o ../addon.cc 
    g++ -shared -pthread -rdynamic -m64 -Wl,-soname=protobuf_for_node.node -o Release/obj.target/protobuf_for_node.node -Wl,--start-group Release/obj.target/protobuf_for_node/protobuf_for_node.o Release/obj.target/protobuf_for_node/addon.o 
-Wl,--end-group ../sdk/protobuf/2.5.0/linux-x64/libprotobuf.a 
/usr/bin/ld: ../sdk/protobuf/2.5.0/linux-x64/libprotobuf.a(descriptor.o): In function `void google::protobuf::STLDeleteContainerPointers<__gnu_cxx::__normal_iterator<google::protobuf::FileDescriptorTables**, std::vector<google::protobuf:: 
FileDescriptorTables*, std::allocator<google::protobuf::FileDescriptorTables*> > > >(__gnu_cxx::__normal_iterator<google::protobuf::FileDescriptorTables**, std::vector<google::protobuf::FileDescriptorTables*, std::allocator<google::protob 
uf::FileDescriptorTables*> > >, __gnu_cxx::__normal_iterator<google::protobuf::FileDescriptorTables**, std::vector<google::protobuf::FileDescriptorTables*, std::allocator<google::protobuf::FileDescriptorTables*> > >)': 
(.text._ZN6google8protobuf26STLDeleteContainerPointersIN9__gnu_cxx17__normal_iteratorIPPNS0_20FileDescriptorTablesESt6vectorIS5_SaIS5_EEEEEEvT_SB_[_ZN6google8protobuf26STLDeleteContainerPointersIN9__gnu_cxx17__normal_iteratorIPPNS0_20File 
DescriptorTablesESt6vectorIS5_SaIS5_EEEEEEvT_SB_]+0x44): call to `google::protobuf::FileDescriptorTables::~FileDescriptorTables()' lacks nop, can't restore toc; recompile with -fPIC 
/usr/bin/ld: final link failed: Bad value 
collect2: error: ld returned 1 exit status 
make: *** [Release/obj.target/protobuf_for_node.node] Error 1 
make: Leaving directory `/root/nodejs/napp1/node_modules/mynodemod/node_modules/mynodemod-protobuf/build' 
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2 
gyp ERR! stack  at ChildProcess.onExit (/root/nodejs/napp1/node_modules/node-gyp/lib/build.js:276:23) 
gyp ERR! stack  at emitTwo (events.js:87:13) 
gyp ERR! stack  at ChildProcess.emit (events.js:172:7) 
gyp ERR! stack  at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12) 
gyp ERR! System Linux 3.10.0-229.ael7b.ppc64le 
gyp ERR! command "/root/ibm/node/bin/node" "/root/nodejs/napp1/node_modules/.bin/node-gyp" "rebuild" "--verbose" 
gyp ERR! cwd /root/nodejs/napp1/node_modules/mynodemod/node_modules/mynodemod-protobuf 
gyp ERR! node -v v4.2.6 
gyp ERR! node-gyp -v v3.2.1 
+0

编辑您的问题,添加您的评论中提到的实际问题。 – bastelflp

回答

0

嗯,我似乎已经得到它来编译......环顾四周,在一些看似不相关的职位,并开始,如果说我的连接在protobuf的静态库必须与-fPIC以及编译疑惑。由于我从RPM获得了库,我继续从fPIC的源代码重建它们。现在我的节点GYP编译罚款......

希望这会帮助别人,因为我撞了我在这头一会...

0

你可能会打,如果没有调用外部函数的内联汇编在它之后添加一个nop(用于TOC恢复)。

POWER ABI v2,在部分2.3.6。函数调用,说:

函数调用需要与通过TOC指针寄存器r2建立,维护和恢复寻址能力一起执行。当一个函数被调用时,TOC指针寄存器可能被修改。如果r2 在被调用者中具有相同的值,则调用者必须在bl指令执行呼叫后提供nop。外部通话通常如此。如果调用者和被调用者使用不同的r2值,链接器将用r2恢复指令替换nop,如果它们使用相同的r2值,则链接器保持不变。这种方案避免了让编译器在每次外部呼叫周围产生过度保守的r2保存和恢复。