我正在尝试在64位Debian上编译CodeViz。但是,我发现GCC包含的补丁导致GCC无法编译。当我提取GCC 4.6并手动编译时(通过运行
)$ ../gcc-4.6.4/configure --prefix=/home/jeremy/gcc-codeviz --enable-languages=c,c++ --disable-bootstrap
$ make
)它编译没有错误。但是,当我应用包含的补丁时,它会失败并显示错误
/usr/bin/ld: ../libsupc++/.libs/libsupc++convenience.a(cp-demangle.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
../libsupc++/.libs/libsupc++convenience.a(cp-demangle.o): error adding symbols: Bad value
collect2: ld returned 1 exit status
这里可以看到补丁http://pastebin.com/djSQYe5a。它实际上并不复杂,不会更改任何构建选项或包含,也不会使用任何高级语言功能。我真的不明白这是如何导致链接错误没有出现在vanilla gcc构建中。此外,错误本身发生在“cp-demangle.o”中,我认为甚至不应该被补丁触及!我最好的猜测是它与声明的extern int cdepn_dump或tree.h中函数的声明有关。
感谢任何帮助。
答案 0 :(得分:0)
此补丁可以应用于Debian gcc-4.6
的源代码apt-get source gcc-4.6
cp gcc-4.6.2-cdepn.diff gcc-4.6-4.6.3/debian/patches
到rules.patch
nano gcc-4.6-4.6.3/debian/rules.patch
debian_patches += \
libstdc++-pic \
...
gcc-4.6.2-cdepn \
发生主要错误的原因是函数 fprintf 。 The default compiler flags includes -Wformat -Wformat-security这就是出现此错误的原因。在CPPFLAGS或/和CFLAGS中禁用 -Wformat = 0或-Wno-format-security 。
另请参阅gcc-4.6-4.6.3 / debian / patches / fix-warnings.diff src / gcc / toplev.c和gcc-4.6-4.6.3 / debian / rules2,dpkg-buildflags 仅供参考。
export DEB_BUILD_MAINT_OPTIONS=hardening=-all,-format
export DEB_CFLAGS_MAINT_APPEND=-fPIC,-Wformat=0,-Wno-format-security
export DEB_CPPFLAGS_MAINT_APPEND=-fPIC,-Wformat=0,-Wno-format-security
export DEB_CXXFLAGS_MAINT_APPEND=-fPIC,-Wformat=0,-Wno-format-security
dpkg-buildflags
dpkg-buildpackage -b -d -rfakeroot -us -uc