我正在尝试在/ usr / local中构建和安装我自己的gcc 4.7.2,以代替/ usr中的gcc 4.4.6。 (这是在CentOS 6.3上。)
gcc生成可动态链接到其自己的动态库的可执行文件和动态库,例如的libstdc ++。如此。如何构建和安装gcc,以便生成的二进制文件自动获得链接器-rpath选项(-rpath / usr / local / lib64),该选项导致/ usr / local / lib64中的动态库链接而不是/ usr /中的动态库lib64或/ lib64?
如果它正常工作,在用gcc构建可执行文件而不指定“-Wl,-rpath = / usr / local / lib64”之后,当我查看可执行文件时,它应该显示/ usr / local / lib64 / libstdc ++ .so.6而不是/usr/lib64/libstdc++.so.6。类似地,对于libgcc_s.so.1。
我尝试过不同的方法,包括在'configure'命令行中指定LDFLAGS_FOR_TARGET = -Wl,-rpath = / usr / local / lib64,-rpath = / usr / local / lib,但没有任何效果。
答案 0 :(得分:6)
如果您不想出口路径,那么可以采用其他解决方案:
使用PATH
中的工具链
gcc -dumpspecs > specsfile
修改specsfile
,在link
部分添加-rpath
示例:
*link:
%{!static:--eh-frame-hdr} -m %(link_emulation) %{shared:-shared} %{!shared: %{!static: %{rdynamic:-export-dynamic} -dynamic-linker %(dynamic_linker)} %{static:-static}} -rpath /usr/local/lib64
此时您可以测试它是否适用于:
g++ -specs=specsfile test.cpp
readelf -d a.out |grep RPATH
如果有效,你可以永久保存(无需每次都通过-specs
)
strace -fF -o /tmp/g++.log g++ test.cpp
grep specs /tmp/g++.log
grep应显示gcc
查找默认specs
文件的路径。
specs文件足够灵活,允许根据变量进行条件链接,例如:
{!static: %{mabi=n32:-rpath-link %R/lib32:%R/usr/lib32} %{mabi=64:-rpath-link %R/lib64:%R/usr/lib64} %{mabi=32:-rpath-link %R/lib:%R/usr/lib}}
应该使用不同的和多个路径,具体取决于mabi(尚未经过测试),%R
应该是sysroot
路径,可以使用所需的完整路径进行更改。
还有一个--with-specs=
选项gcc configure最终将在构建时使用,我还不清楚如何使用。link
部分(工作)在它上面)
--with-specs="%{shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}%{!shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}"
一切正常,我只使用shared
而不是!shared
进行测试,可能应该使用一些更智能的条件,请注意它没有报告-dumpspecs
。< / p>
通过gcc邮件列表的某个主题阅读我的印象specs
并不是每个人都喜欢(但如果我没有错,请添加另一个选项--with-extra-specs
)进行此类自定义的首选方式似乎是configure.host
,但我已经完成而没有查看它,玩得开心! : - )
更新
我不知道您是否可以设置预定义的rpath
,可能是因为您可能位于ld
的链接器binutils
而不是gcc/g++
,但你为什么要这样做?
只需在运行时导出LD_LIBRARY_PATH
,在构建时导出LD_RUN_PATH
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
ldd a.out
ldd
应显示您导出的路径。
引用使用libtool构建共享库时给出的消息:
如果您碰巧想要链接给定目录中的已安装库LIBDIR,您必须使用libtool,并指定库的完整路径名,或使用`-LLIBDIR&#39;在链接期间标记并至少执行以下操作之一:
- 将LIBDIR添加到`LD_LIBRARY_PATH&#39;执行期间的环境变量
- 将LIBDIR添加到`LD_RUN_PATH&#39;链接期间的环境变量
- 使用`-Wl, - rpath -Wl,LIBDIR&#39;链接器标志
- 请系统管理员将LIBDIR添加到`/etc/ld.so.conf'
请参阅有关共享库的任何操作系统文档 更多信息,例如ld(1)和ld.so(8)手册页。
表示完整性
我用来测试这个东西的Makefile
,所有的配置选项,环境变量(参见boot ldflags)我试过没有工作,包括--enable-rpath
。
与mkdir ~/gcc
一起使用时将Makefile
复制到~/gcc
然后cd ~/gcc && make build-gcc
通知所使用的选项仅适用于此测试用例,不能用作参考。
FETCH = aria2c --file-allocation=none -c -d dl
NICE = nice -n 19
PARALLEL = -j4
DESTDIR = $(HOME)/gcc/install
SRCDIR = $(HOME)/gcc/src
all:
# if more downloads are added just remove {dl,src}/*-my-stamp not the .bak
# the .bak should avoid to rebuild targets because of timestamp
touch_stamp = if [ -f $@.bak ]; then \
touch -r $@.bak $@; \
else \
touch $@ $@.bak; \
fi
dl/dl-my-stamp:
$(FETCH) https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2
$(FETCH) http://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.bz2
$(FETCH) ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
$(FETCH) https://ftp.gnu.org/gnu/mpfr/mpfr-2.4.2.tar.bz2
$(FETCH) --check-certificate=false http://www.mirrorservice.org/sites/sourceware.org/pub/binutils/snapshots/binutils-2.24.51.tar.bz2 \
ftp://sourceware.org/pub/binutils/snapshots/binutils-2.24.51.tar.bz2
$(touch_stamp)
untar_dep = src/untar-my-stamp
src/untar-my-stamp: dl/dl-my-stamp
mkdir -p src
tar -C src -xjf dl/gcc-4.7.2.tar.bz2
tar -C src -xjf dl/gmp-4.3.2.tar.bz2
tar -C src -xzf dl/mpc-0.8.1.tar.gz
tar -C src -xjf dl/mpfr-2.4.2.tar.bz2
tar -C src -xjf dl/binutils-2.24.51.tar.bz2
$(touch_stamp)
define configure-rule
$(1)_install = $(DESTDIR)/$(1)-install-my-stamp
$(1)_builddir = $$($(1)_dir)/build
$(DESTDIR)/$(1)-install-my-stamp: $$($(1)_deps)
mkdir -p $$($(1)_builddir)
cd $$($(1)_builddir) && \
$$($(1)_env) ../configure --cache-file=$(SRCDIR)/$(1)-config.cache \
$$($(1)_configure)
$(NICE) make -C $$($(1)_builddir) $$($(1)_make_target) $(PARALLEL)
ifneq ($$($(1)_post_make),)
$$($(1)_post_make)
endif
touch $$@
.PHONY: build-$(1) clean-$(1)
build-$(1): $$($(1)_install)
clean-$(1):
-rm -fr $$($(1)_builddir)
endef
gmp_dir = src/gmp-4.3.2
gmp_env = CONFIG_SITE=$(SRCDIR)/config.site
gmp_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static --enable-cxx
gmp_deps = $(untar_dep)
gmp_make_target = install
$(eval $(call configure-rule,gmp))
mpfr_dir = src/mpfr-2.4.2
mpfr_env = CONFIG_SITE=$(SRCDIR)/config.site
mpfr_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static \
--with-gmp=$(DESTDIR)
mpfr_deps = $(untar_dep) $(gmp_install)
mpfr_make_target = install
$(eval $(call configure-rule,mpfr))
mpc_dir = src/mpc-0.8.1
mpc_env = CONFIG_SITE=$(SRCDIR)/config.site
mpc_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static \
--with-gmp=$(DESTDIR) --with-mpfr=$(DESTDIR)
mpc_deps = $(untar_dep) $(gmp_install) $(mpfr_install)
mpc_make_target = install
$(eval $(call configure-rule,mpc))
gcc_dir = src/gcc-4.7.2
gcc_env = CONFIG_SITE=$(SRCDIR)/config.site \
CFLAGS="-I/usr/include/i386-linux-gnu" \
CXXFLAGS="-I/usr/include/i386-linux-gnu"
gcc_configure = --prefix=$(DESTDIR) \
--libdir=$(DESTDIR)/lib \
--with-local-prefix=$(DESTDIR) \
--with-gmp=$(DESTDIR) --with-mpfr=$(DESTDIR) \
--with-mpc=$(DESTDIR) \
--disable-bootstrap \
--enable-languages=c,c++ \
--disable-libgomp --disable-multilib \
--disable-libmudflap --disable-libssp \
--disable-libquadmath \
--enable-rpath \
MAKEINFO=missing
gcc_deps = $(untar_dep) $(gmp_install) $(mpfr_install) $(mpc_install)
gcc_make_target =
gcc_post_make = make -C $(gcc_builddir) install
$(eval $(call configure-rule,gcc))
binutils_dir = src/binutils-2.24.51
#binutils_env = LDFLAGS=-Wl,-rpath\ $(DESTDIR)/lib
binutils_env = CONFIG_SITE=$(SRCDIR)/config.site \
CFLAGS="-I/usr/include/i386-linux-gnu" \
BOOT_LDFLAGS="-rpath-link=$(DESTDIR)/lib -rpath=$(DESTDIR)/lib"
binutils_configure = --prefix=$(DESTDIR) \
--libdir=$(DESTDIR)/lib \
--with-gmp=$(DESTDIR) \
--enable-rpath
binutils_deps = $(untar_dep) $(gmp_install)
#binutils_make_target = install
binutils_post_make = make -C $(binutils_builddir) install
$(eval $(call configure-rule,binutils))
.PHONY: env
env:
@echo export PATH=$(DESTDIR)/bin:\$$PATH
@echo export LIBRARY_PATH=/usr/lib/i386-linux-gnu
答案 1 :(得分:0)
在gcc 4.8.3上,在配置步骤上使用--with-boot-ldflags =“-Wl,-rpath,/ some / path”似乎对我有用。文档对此进行了一些https://gcc.gnu.org/install/configure.html讨论,但其想法是,默认情况下,gcc构建了一个多阶段构建(自行重建),并且在第一阶段之后,使用了一组不同的ldflags,我可以告诉第一阶段遵循LDFLAGS和LDFLAGS_FOR_TARGET,但以后阶段不这样做