Принудительно установить относительный путь к символу отладки (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.