首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(PPC64le)链接到protobuf的模块的node-gyp重建失败,并显示"lacks,can't restore toc;recompile with -fPIC“

(PPC64le)链接到protobuf的模块的node-gyp重建失败,并显示"lacks,can't restore toc;recompile with -fPIC“
EN

Stack Overflow用户
提问于 2016-02-13 22:59:12
回答 2查看 279关注 0票数 1

第一次的海报,很长时间的粉丝…

我试图在RHEL7.1上为ppc64le (小端)重建一个节点模块,并得到以下令人困惑的输出。我在x64 vm上执行了相同的步骤,一切都编译得很好。

下面是输出的一部分,尽管它说要使用-fPIC编译,但该选项已经在发出的g++命令中,如输出中所示,所以我不知道如何处理这个错误。

尽管它在linux-x64目录中查找静态protobuf库:../sdk/protobuf/2.5.0/linux-x64/libprotobuf.a

我将该目录中的内容替换为为ppc64le编译的库,这些库来自epel代码库的protobuf-static-2.5.0-7.el7.ppc64le rpm。因此,库应该是ok的,并且它们的版本与node模块期望的版本相同。

那么这个错误是什么意思呢?我怎么才能克服它呢?我使用的相同步骤在linux-x64中运行良好。我能想到的主要区别是我必须为静态引入一些静态库(protobuf.a),这是我从protobuf- ppc64le -2.5.0-7.el7.ppc64le包中获得的。这些被链接到我正在跳转的节点模块中。下面是'node-gyp rebuild --verbose‘的输出

提前感谢!

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2016-02-15 14:31:24

我似乎已经把它编译好了……看了看一些看似不相关的帖子,我开始想知道我链接的protobuf静态库是否也必须用-fPIC编译。因为我从RPM获得了库,所以我继续使用fPIC从源重新构建它们。现在我的node-gyp编译正常...

希望这能帮助其他人,因为我在这上面撞了一段时间……

票数 0
EN

Stack Overflow用户

发布于 2018-01-15 23:34:01

您可能正在访问调用外部函数而不添加nop的内联程序集(用于TOC还原)。

POWER ABI v2,在2.3.6节中。函数调用,如下所示:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35381383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档