G++编译器:选项-s已经过时并被忽略。C++

9

我正在尝试使用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

你为什么想要剥离二进制文件?现代系统有很多空间,删除信息似乎有点多余。此外,在剥离二进制文件上诊断问题几乎是不可能的。 - Martin York
2
为什么你不直接写 #include <iostream> 而是要写全路径呢? - Mark B
@Tux-D 一个可能的原因是它使得逆向工程更加困难。 - Seth Carnegie
Tux-D 不错,但原因很简单。编译、执行和剥离这个简单的程序是我所参加的 C++ 课程中列出的一项练习。Mark B,因为那样会使用默认的 iostream,而不是我新安装的 iostream,后者是随 gcc 4.6.0 编译器一起安装的,大小比默认的大了 255 字节。 - Tieme
2个回答

7

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

gcc-s选项传递给链接器,如gcc 4.6.1手册所述;显然,gcc的MacOS端口仍然这样做。

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

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

与GNU的gcc手册不同,macOS gcc手册没有提到“-s”。


好的,但显然根据文件大小对文件进行某种剥离。那是不是意味着系统有两个链接器?GCC链接器和MACOS链接器?而其中一个认为它是过时的选项? - Tieme
@Tieme:我非常怀疑。MacOS的ld确实会进行某些剥离操作;只是它不支持-s选项。gcc是否曾经没有对-s选项发出警告? - Keith Thompson

2

显然,-s标志已经过时。不过你可以使用strip程序代替。


这是否意味着符号(默认情况下)仍然存在,还是已经被剥离? - Mysticial
除非剥离,否则某些信息始终存在。使用“-g”可以获得更多信息。 - Mark B
它似乎并不在所有系统中都已经过时;gcc 4.6.1文档仍然提到了“-s”。 - Keith Thompson
@Keith 那么也许这条消息已经过时了。 - Seth Carnegie
@Seth:警告来自ld,而不是gcc。这与MacOS使用的ld版本有关。值得看一下在MacOS上的gcc和ld文档。 - Keith Thompson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接