何时应使用-fPIC手动编译和链接共享库?

时间:2019-02-26 23:35:51

标签: position-independent-code

我正在尝试使用boost-python编写一个非常简单的模块,并试图手工进行编译,并试图找出需要哪些步骤来指导编译器CLI生成与位置无关的代码。

我注意到,只有在链接时(并且根本不提供),才提供参数Root/ - Controller -- Module1 --- Controller --- Controller -- Module2 --- Controller --- Controller - Model -- Module1 --- Model --- Model -- Module1 --- Model --- Model - Repository ... ... - Service ... ... - WEB-INF -- Views --- Module1 ---- .jsp ---- .jsp --- Module2 ---- .jsp ---- .jsp 才能获得功能正常的可从Python加载的共享对象。

在下面的ERP中,仅在生成-fPIC时提供build.sh,而在生成中间-fPIC对象文件时则不提供:

.so

这将产生一个可以运行的共享对象:

.o

当最后一个#!/bin/bash INCLUDES=" -I /usr/local/Cellar/boost/1.68.0_1/include" INCLUDES+=" -I $(dirname $(dirname $(which python)))/include/python*" LINKARGS=" -lpython -lboost_python37" # compile object clang++ $INCLUDES -o hello.o -c hello.cpp # link into shared object clang++ -shared -fPIC $LINKARGS -o hello.so hello.o 不存在且最后一行为> python test_hello.py hello, world

时,build.sh脚本还会生成可加载的共享对象

所以,我的问题是:

  • 何时需要手动提供-fPICclang++ -shared $LINKARGS -o hello.so hello.o是否已经固有地嵌入了位置无关性,还是在链接时有效地选择了位置无关性?
  • 有没有办法避免或发现“虚假的成功”?

不同文件的源代码:

-fPIC

.o

// hello.cpp

char const* greet()
{
  return "hello, world";
}

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello)
{
  using namespace boost::python;
  def("greet", greet);
}

test_hello.py脚本非常特定于OS X,通过自制程序安装的# test_hello.py import hello print (hello.greet()) build.sh中的Python 3.7。

0 个答案:

没有答案