我正在使用 native-maven-plugin 在linux上编译共享库。我传递编译器选项-g
以启用调试符号生成。以下是POM的摘录:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>native-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<workingDirectory></workingDirectory>
<compilerStartOptions>
<compilerStartOption>-g</compilerStartOption>
</compilerStartOptions>
<linkerStartOptions>
<linkerStartOption>-shared</linkerStartOption>
<linkerStartOption>-g</linkerStartOption>
</linkerStartOptions>
<sources>
...
</sources>
</configuration>
</plugin>
native-maven-plugin 在调用 gcc 时会使用源文件的绝对路径。这也导致调试符号中的绝对路径。
列出调试符号的nm -l libfoo.so
输出如下所示:
0000797a T GetTickCount /home/myusername/projects/blabla/foo.c:3005
如您所见,源文件路径是绝对路径,包括我的用户名和项目结构。我不希望这样。 如何将调试符号更改为相对路径名?
答案 0 :(得分:4)
好的,我发现gcc中有一个-fdebug-prefix-map=oldPath=newPath
选项,它完全符合我的要求。要从我的问题编译文件/home/myusername/projects/blabla/foo.c
:
gcc -fdebug-prefix-map=/home/myusername/projects/blabla=theNewPathInDebug -o foo.o foo.c
gcc -shared -o libfoo.so foo.o
然后调试符号路径看起来像(nm -l libfoo.so
):
0000797a T GetTickCount theNewPathInDebug/foo.c:3005
然后,您可以使用gdb路径替换来设置gdb的实际源文件位置。
为了让所有事情都在maven中运行,我的pom看起来像是:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>native-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<workingDirectory></workingDirectory>
<compilerStartOptions>
<compilerStartOption>-g</compilerStartOption>
<compilerStartOption>-fdebug-prefix-map=${project.build.directory}/extracted-c=theNewPathInDebug</compilerStartOption>
</compilerStartOptions>
<linkerStartOptions>
<linkerStartOption>-shared</linkerStartOption>
<linkerStartOption>-g</linkerStartOption>
</linkerStartOptions>
<sources>
<source>
<directory>${project.build.directory}/extracted-c</directory>
<fileNames>
<fileName>foo.c</fileName>
</fileNames>
</source>
</sources>
</configuration>
</plugin>
其中 extracted-c 是 maven-dependency-plugin 提取C源/头文件的位置。