首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能改变gcc的联系方式呢?

有没有可能改变gcc的联系方式呢?
EN

Stack Overflow用户
提问于 2022-04-20 16:52:32
回答 1查看 308关注 0票数 0

我有一个在Solaris 8上编译的gcc二进制文件,为了做一个实验,我把它带到了一个NetBSD 8.2虚拟机上,看看我是否能让它在那个环境中工作。该gcc的编译阶段似乎工作成功(即gcc -c some_program.c),但如果涉及链接器,则链接器似乎会产生分段冲突。我怀疑这与gcc中内置的链接器路径有关。有没有办法在不完全重建二进制文件的情况下改变这条路径?

下面是gcc -v -o small small.c的输出,small.c只有int main() { return 0; }

代码语言:javascript
复制
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/specs
gcc version 2.95.1 19990816 (release)
 /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -Dsparc -Dsun -Dunix -D__svr4__ -D__SVR4 -D__sparc__ -D__sun__ -D__unix__ -D__svr4__ -D__SVR4 -D__sparc -D__sun -D__unix -Asystem(unix) -Asystem(svr4) -D__GCC_NEW_VARARGS__ -Acpu(sparc) -Amachine(sparc) small.c /var/tmp/ccibWaJl.i
GNU CPP version 2.95.1 19990816 (release) (sparc)
#include "..." search starts here:
#include <...> search starts here:
 .
 .
 .
 .
End of search list.
The following default directories have been omitted from the search path:
 /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/../../../../include/g++-3
End of omitted list.
 /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/cc1 /var/tmp/ccibWaJl.i -quiet -dumpbase small.c -version -o /var/tmp/ccCCiV6u.s
GNU C version 2.95.1 19990816 (release) (sparc-sun-solaris2.8) compiled by GNU C version 2.95.1 19990816 (release).
 /usr/ccs/bin/as -V -Qy -s -o /var/tmp/ccqr3F3G.o /var/tmp/ccCCiV6u.s
/usr/ccs/bin/as: Sun WorkShop 6 99/08/18
 /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/collect2 -V -Y P,/usr/ccs/lib:/usr/lib -Qy -o small /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/crt1.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/crti.o /usr/ccs/lib/values-Xa.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/crtbegin.o -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1 -L/usr/ccs/bin -L/usr/ccs/lib -L/usr/local/lib /var/tmp/ccqr3F3G.o -lgcc -lc -lgcc /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/crtend.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/2.95.1/crtn.o
collect2: ld terminated with signal 11 [Segmentation Fault]
ld: Software Generation Utilities - Solaris Link Editors: 5.8-1.281

更新:用于比较,下面是使用NetBSD上的gcc二进制文件的相同编译字符串的输出:

代码语言:javascript
复制
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/lto-wrapper
Target: sparc--netbsdelf
Configured with: /usr/src/tools/gcc/../../external/gpl3/gcc/dist/configure --target=sparc--netbsdelf --enable-long-long --enable-threads --with-bugurl=http://www.NetBSD.org/Misc/send-pr.html --with-pkgversion='NetBSD nb3 20180905' --with-system-zlib --disable-libstdcxx-dual-abi --enable-__cxa_atexit --enable-libstdcxx-time=rt --enable-libstdcxx-threads --with-diagnostics-color=auto-if-env --with-mpc-lib=/var/obj/mknative/sparc/usr/src/external/lgpl3/mpc/lib/libmpc --with-mpfr-lib=/var/obj/mknative/sparc/usr/src/external/lgpl3/mpfr/lib/libmpfr --with-gmp-lib=/var/obj/mknative/sparc/usr/src/external/lgpl3/gmp/lib/libgmp --with-mpc-include=/usr/src/external/lgpl3/mpc/dist/src --with-mpfr-include=/usr/src/external/lgpl3/mpfr/dist/src --with-gmp-include=/usr/src/external/lgpl3/gmp/lib/libgmp/arch/sparc --enable-tls --disable-multilib --disable-symvers --disable-libstdcxx-pch --disable-libstdcxx-dual-abi --build=sparc--netbsdelf --host=sparc--netbsdelf --with-sysroot=/var/obj/mknative/sparc/usr/src/destdir.sparc
Thread model: posix
gcc version 5.5.0 (nb3 20180905) 
COLLECT_GCC_OPTIONS='-v' '-o' 'small' '-mcpu=v7'
 /usr/libexec/cc1 -quiet -v small.c -quiet -dumpbase small.c -mcpu=v7 -auxbase small -version -o /tmp//ccZMD7zc.s
GNU C11 (nb3 20180905) version 5.5.0 (sparc--netbsdelf)
    compiled by GNU C version 5.5.0, GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=46 --param ggc-min-heapsize=30704
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/gcc-5
 /usr/include
End of search list.
GNU C11 (nb3 20180905) version 5.5.0 (sparc--netbsdelf)
    compiled by GNU C version 5.5.0, GMP version 5.1.3, MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=46 --param ggc-min-heapsize=30704
Compiler executable checksum: 2df9f867f6d360c5052229962b633018
COLLECT_GCC_OPTIONS='-v' '-o' 'small' '-mcpu=v7'
 as -v -32 -relax -o /tmp//ccXtMemo.o /tmp//ccZMD7zc.s
GNU assembler version 2.27 (sparc--netbsdelf) using BFD version (NetBSD Binutils nb1) 2.27
COMPILER_PATH=/usr/libexec/
LIBRARY_PATH=/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'small' '-mcpu=v7'
 ld -plugin /usr/libexec/liblto_plugin.so -plugin-opt=/usr/libexec/lto-wrapper -plugin-opt=-fresolution=/tmp//ccyzsYKQ.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc --eh-frame-hdr -m elf32_sparc -relax -dc -dp -e __start -dynamic-linker /usr/libexec/ld.elf_so -o small /usr/lib/crt0.o /usr/lib/crti.o /usr/lib/crtbegin.o /tmp//ccXtMemo.o --as-needed -lgcc_s --no-as-needed -lgcc -lc --as-needed -lgcc_s --no-as-needed -lgcc -lc /usr/lib/crtend.o /usr/lib/crtn.o

更新从04/20/2022 5:46 PM EST:我已经在我的Solaris 8虚拟机上安装了gcc 3.4.6版本,它似乎在那里工作。但是,当Solaris 8 NetBSD二进制文件运行时,将该二进制文件以及所有必需的库传输到gcc会立即导致分段冲突。不过,其他一些来自Solaris 8 VM的动态链接二进制文件似乎仍然可以使用。

我还尝试将-B标志指定为原始的2.95.1 gcc二进制文件,并传递包含collect2可执行文件的目录。这似乎对结果没有任何影响。也许我会尝试使用其他版本的gcc.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-21 00:13:37

按照Eugene在关于OP的第一个评论中的建议,似乎单独引用链接器是有效的。下面是我为获得一个可执行文件而采取的高级步骤:

  1. gcc -c编译小程序以获得一个目标文件。
  2. -v运行gcc的所有阶段以获得gcc试图运行的链接器命令。
  3. 将输出的链接器行复制到shell脚本,并替换链接器的各个路径以及与正确路径相关的所有目标文件。H 210H 111-rpath参数添加到命令中,以覆盖"*.so库中没有发现的“错误。H 214H 115运行shell script.H216<。/code>
  4. 运行生成的程序.

感谢每一个评论的人,以及操作!

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

https://stackoverflow.com/questions/71943476

复制
相关文章

相似问题

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