Solaris Studio在目标文件中添加当前目录信息

时间:2016-04-13 05:53:28

标签: c++ compilation solaris

我正在尝试使用Solaris 11上的Solaris Studio 12.x构建一个简单的hello world程序。如果我从两个不同的文件夹编译相同的文件,我会在diff文件或cmp中显示对象文件中的差异命令。

对两个目标文件(od -x)进行十六进制转储并比较它们并使用可以将十六进制转换为ASCII的在线工具,发现差异正在发生,因为目标文件包含编译所在的当前目录。启动。

问题是如何告诉编译器不要在目标文件中包含当前目录的信息。尝试了一些优化选项 - 对解决这个问题没有用。

以下是我使用的代码和命令:

bash-4.1$ cat a.cpp
#include <stdio.h>

int main() {
  printf("Hello World!");
  return 0;

}
bash-4.1$ ls
a.cpp  temp1  temp2
bash-4.1$ cd temp1
bash-4.1$ /opt/SunProd/studio12u3/solarisstudio12.3//bin/CC ../a.cpp
bash-4.1$ cd ../temp2
bash-4.1$ /opt/SunProd/studio12u3/solarisstudio12.3//bin/CC ../a.cpp
bash-4.1$ cd ..
bash-4.1$ diff temp1/a.out temp2/a.out
Binary files temp1/a.out and temp2/a.out differ
bash-4.1$ cmp temp1/a.out temp2/a.out
temp1/a.out temp2/a.out differ: char 5968, line 24
bash-4.1$ od -x temp1/a.out > temp1/a.hex
bash-4.1$ od -x temp2/a.out > temp2/a.hex
bash-4.1$ diff -c temp1/a.hex temp2/a.hex 
... shows hex diff (two sets) ...

2 个答案:

答案 0 :(得分:2)

编译器嵌入了对调试器有用的信息。默认情况下,此信息采用dwarf格式。

您可以使用dwarfdump命令提取二进制文件的此信息。如果比较为每个文件生成的输出,您将看到编译原始二进制文件的目录存储在矮化标题中的几个位置,例如:

# diff */*.dwarf
9c9
<                     DW_AT_comp_dir              "/tmp/temp1/"
---
>                     DW_AT_comp_dir              "/tmp/temp2/"
29c29
<    2:  N_CMDLINE 0x0,0x0,0x0  "/tmp/temp1/; /opt/solarisstudio12.4/bin/CC  ../a.c"
---
>    2:  N_CMDLINE 0x0,0x0,0x0  "/tmp/temp2/; /opt/solarisstudio12.4/bin/CC  ../a.c"

剥离二进制文件(strip a.out)应删除该标头并使两个编译文件完全相同。

如果您使用较旧版本的编译器或使用-xdebugformat=stabs编译器选项,则调试信息将以stabs格式而不是dwarf格式存储。在这种情况下,提取它的命令是dumpstabs,并且会发现与编译目录相关的类似差异,例如:

.stabs "/tmp/temp1/; /opt/solarisstudio12.4/bin/CC -xdebugformat=stabs  ../a.c",N_CMDLINE,0x0,0x0,0x0

答案 1 :(得分:0)

我得到的一个信息是使用-zstrip-class = debug选项,它从目标文件中删除此路径信息。检查使用此选项后,从两个不同文件夹创建的两个目标文件之间没有区别。 但是,正如此页面(https://docs.oracle.com/cd/E26502_01/html/E29030/ld-1.html)所示,此选项会从目标文件中删除与调试信息相关的部分。 似乎没有更简单的选项可以在需要时仅删除路径信息并保留其他调试信息。