4

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

如您所见,源文件路径是绝对路径,包括我的用户名和项目结构。我不想要那个。如何将调试符号更改为相对路径名?

4

1 回答 1

4

好的,我发现-fdebug-prefix-map=oldPath=newPathgcc 中有一个选项可以满足我的要求。/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-cmaven-dependency-plugin提取C 源/头文件的位置。

于 2013-05-24T13:23:15.977 回答