Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Solaris Studio在对象文件中添加当前目录信息_C++_Compilation_Solaris - Fatal编程技术网

C++ Solaris Studio在对象文件中添加当前目录信息

C++ Solaris Studio在对象文件中添加当前目录信息,c++,compilation,solaris,C++,Compilation,Solaris,我正在尝试在Solaris 11上使用Solaris Studio 12.x构建一个简单的hello world程序。如果我从两个不同的文件夹编译同一个文件,我会在目标文件中得到一个差异,如diff命令或cmp命令所示 对两个对象文件(od-x)进行十六进制转储,并将它们进行比较,然后使用可以将十六进制转换为ASCII的在线工具,发现不同之处在于对象文件包含启动编译的当前目录 问题是如何告诉编译器不要在对象文件中包含当前目录的信息。尝试了几个优化选项-对解决此问题没有帮助 以下是我使用的代码和命

我正在尝试在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) ...
bash-4.1$cat a.cpp
#包括
int main(){
printf(“你好,世界!”);
返回0;
}
bash-4.1$ls
a、 cpp temp1 temp2
bash-4.1$cd temp1
bash-4.1$/opt/SunProd/studio12u3/solaristudio12.3//bin/CC../a.cpp
bash-4.1$cd../temp2
bash-4.1$/opt/SunProd/studio12u3/solaristudio12.3//bin/CC../a.cpp
bash-4.1$cd。。
bash-4.1$diff temp1/a.out temp2/a.out
二进制文件temp1/a.out和temp2/a.out不同
bash-4.1$cmp temp1/a.out temp2/a.out
temp1/a.out temp2/a.out不同:字符5968,第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
... 显示十六进制差异(两组)。。。

编译器正在嵌入对调试器有用的信息。默认情况下,此信息的格式为

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

# 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"

编译器正在嵌入对调试器有用的信息。默认情况下,此信息的格式为

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

# 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"

我从中得到的一个信息是使用-zstrip class=debug选项,它从对象文件中删除这个路径信息。检查使用此选项后,从两个不同文件夹创建的两个对象文件之间是否没有差异。 但是,如本页()所示,此选项从对象文件中删除与调试信息相关的部分。
似乎没有更简单的选项只删除路径信息,并在需要时保留其他调试信息。

我从中得到的一个信息是使用-zstrip class=debug选项,它从对象文件中删除此路径信息。检查使用此选项后,从两个不同文件夹创建的两个对象文件之间是否没有差异。 但是,如本页()所示,此选项从对象文件中删除与调试信息相关的部分。 似乎没有更简单的选项可以在需要时只删除路径信息并保留其他调试信息