【问题标题】:G++ compiler: option -s is obsolete and being ignored C++G++ 编译器:选项 -s 已过时并被忽略 C++
【发布时间】:2011-09-13 21:21:52
【问题描述】:

我正在尝试使用 g++ 编译器(Mac OSX 上的 4.6.0)在 C++ 中编译和剥离一个非常简单的程序。但是在编译时我得到一个警告。


源代码:

#include </usr/local/Cellar/gcc/4.6.0/gcc/include/c++/4.6.0/iostream>

int main(){
    std::cout << ("Hello World\n") ;
}

终端代码:

g++ hello.cc -Wall -std=c++0x -s
    /* or an alternative: */
g++ hello.cc -Wall -std=c++0x -o test -Wl,-s

编译器警告:

ld: warning: option -s is obsolete and being ignored

有人知道这个奇怪的警告吗?

编辑:

奇怪的是大小确实在使用 -s 标志时减小,从 9,216 字节减少到 9,008。

但是,当我使用以下内容时,大小会减少到 8,896 字节。

cp hello hello_stripped
strip hello_stripped

【问题讨论】:

  • 为什么要剥离二进制文件?现代系统有如此多的空间,删除信息似乎有点多余。此外,在剥离的二进制文件上诊断问题实际上是不可能的。
  • 你为什么不直接说#include &lt;iostream&gt;而不是完整路径?
  • @Tux-D 一个原因可能是逆向工程变得更加困难。
  • - Tux-D 不错,但原因很简单。编译、执行和剥离这个简单的程序是我注册的 c++ 课程中列出的一个练习。 - 标记 B,因为它将采用默认 iostream 而不是我新安装的 iostream,它与 gcc 4.6.0 编译器一起提供,大 255 字节..

标签: c++ macos g++


【解决方案1】:

错误消息来自ld,而不是来自gccg++。 (gccg++ 命令是调用编译器、链接器和其他工具的驱动程序。)

gcc-s 选项传递给链接器,如gcc 4.6.1 manual 中所述;显然gcc 的 MacOS 端口仍然如此。

GNU 链接器 (GNU ld) 仍然接受具有其通常含义的 -s 选项。但是 MacOS 链接器(也称为 ld)会忽略它,如 MacOS ld manual 中所述:

-s 完全剥离输出,包括删除符号表。 不再支持此文件格式变体。这个选项是 过时了。

而且MacOS gcc manual 与 GNU 的 gcc 手册不同,它没有提到“-s”。

【讨论】:

  • 好的,但显然文件会根据文件大小进行某种剥离。这是否意味着系统有两个链接器? GCC 链接器和 MACOS 链接器?有人认为这是一个过时的选择?
  • @Tieme:我严重怀疑。 MacOS ld 确实做了一些剥离;它只是不支持-s。 gcc ever 不会警告-s 选项吗?
【解决方案2】:

显然-s 标志已过时。不过,您可以改用strip 程序。

【讨论】:

  • 这是否意味着符号(默认情况下)仍然存在,或者已经被剥离?
  • 某些信息始终存在,除非被剥离。更多信息请联系-g
  • 它似乎并非在所有系统上都已过时; gcc 4.6.1 文档仍然提到“-s”。
  • @Keith 那么消息可能已经过时了。
  • 是的,您可以使用 strip 命令,但这只是另一种解决方法。我想知道是什么导致了警告...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2018-06-19
相关资源
最近更新 更多