Принудительно установить относительный путь к символу отладки (maven-native-plugin)

Я использую 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> 

Родной-maven-plugin всегда использует абсолютные пути к исходным файлам при вызове gcc. Это также приводит к абсолютным путям в символах отладки. Выход из nm -l libfoo.so список символов отладки выглядит так:

0000797a T GetTickCount /home/myusername/projects/blabla/foo.c:3005

Как видите, путь к исходному файлу является абсолютным и включает мое имя пользователя и структуру проекта. Я не хочу этого Как я могу изменить символы отладки на относительные имена путей?

1 ответ

Решение

Хорошо, я узнал, что есть -fdebug-prefix-map=oldPath=newPath вариант в gcc, который делает именно то, что я хочу. Скомпилировать файл /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> 

Где extract-c - это место, где плагин maven-dependency-plugin извлекает исходные / заголовочные файлы C.

Другие вопросы по тегам