【问题标题】:How to stop gcc from passing -L with standard library paths to the linker如何阻止 gcc 将带有标准库路径的 -L 传递给链接器
【发布时间】:2010-12-18 20:52:53
【问题描述】:

我有一个脚本需要阻止 gcc 将带有标准库路径的 -L 传递给 ld。使用-nostdlib 会抑制-lc -lgcc 等,但不会抑制-L。使用-Wl,-nostdlib 可以防止链接器使用它自己的标准路径,但不会阻止gcc 通过标准路径传递-L。有什么方法可以确保 gcc 在库路径中没有任何内容的情况下调用链接器,期望我在命令行上明确写入的目录?

【问题讨论】:

  • 不带参数直接调用链接器怎么样?我几乎想问'你为什么需要这个'?我假设你有一个完全替代的某种标准库,但是你应该能够优先选择你的库而不是标准库。
  • 您是否尝试编译单独的目标文件(gcc -c)然后手动链接它们?
  • @Jonathan:确实,选择替换库而不是标准库是没有问题的。问题是配置查找其他库的脚本,并错误地在针对标准库构建的标准路径中找到那些,而不是确定特定库不存在。我不能只手动调用ld,除非我重新实现整个 gcc 命令行逻辑,我不想在 shell 脚本中这样做......
  • @ulidtko:当然我可以手动链接就好了。我正在尝试为 gcc 制作一个包装脚本,它可以用于编译任意程序(无需编辑它们的构建脚本)。
  • 看来我自己找到了答案.. :-)

标签: c gcc linker path


【解决方案1】:

我找到了一个解决方案,但它取决于 gcc 4.4 或更高版本的 -wrapper 选项(脚本的略微更新版本):

inc=/path/to/alt/incl
lib=/path/to/alt/libs
crt=/path/to/alt/crt1.o
gcc -wrapper sh,-c,'
x= ; z= ; s= ; for i ; do
[ "$z" ] || set -- ; z=1
case "$i" in
-shared) s=1 ; set -- "$@" "$i" ;;
-Lxxxxxx) x=1 ;;
-xxxxxx) x= ; [ "$s" ] || set -- "$@" '"'$crt'"' ;;
*) [ "$x" ] || set -- "$@" "$i" ;;
esac
done
exec "$0" "$@"
' -nostdinc -nostdlib -isystem "$inc" -Wl,-xxxxxx "$@" -L"$lib" -Lxxxxxx -Wl,-nostdlib -lc -lgcc

我的这个包装器版本被调整为重新添加备用 crt1.olibclibgcc 文件来代替它阻止访问的文件,但如果需要,您可以轻松地忽略它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2021-04-12
    • 1970-01-01
    相关资源
    最近更新 更多