使gcc将相对文件名放在调试信息中 [英] Make gcc put relative filenames in debug information

查看:369
本文介绍了使gcc将相对文件名放在调试信息中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编译的项目使用CMake,其喜欢绝对路径名

The project I'm compiling uses CMake, which loves absolute pathnames.

当我在调试信息启用的情况下编译时,gcc将这些长名称放入 .debug_str 节中,这对调试不利。

When I compile with debugging information enabled, gcc puts those long names into .debug_str sections, which is bad for debugging. I'd like to have short relative-to-project-root pathnames there instead.

是否有一些选项来告诉gcc在发布调试数据之前剥离路径名的某些部分?

Is there some option to tell gcc to strip some part of pathname before emitting debug data? Or, maybe, there is some tool that could do that on compiled binaries?

我尝试过使用 SET(CMAKE_USE_RELATIVE_PATHS ON)(这似乎是对 a> by devs)选项,但是由于我使用的是源代码构建,路径名仍然不是我想要的形式。也就是说它们 ./../ src / mod_foo / foo.c 而不是 mod_foo / foo.c

I've tried using SET(CMAKE_USE_RELATIVE_PATHS ON) (which seems to be frowned upon by devs) option, but as I'm using out-of-source builds, pathnames are still not in the form I'd want them to be. I.e. they're ./../src/mod_foo/foo.c instead of mod_foo/foo.c.

推荐答案

您可以设置 RULE_LAUNCH_COMPILE 属性使CMake调用shell脚本,该脚本在调用gcc之前将源文件路径转换为项目相对路径。使用CMake函数 configure_file 生成了解您的项目的 PROJECT_SOURCE_DIR PROJECT_BINARY_DIR 的shell脚本。

You can set the RULE_LAUNCH_COMPILE property of a CMake target to have CMake invoke a shell script which transforms the source file path to a project relative path before invoking gcc. Use the CMake function configure_file to generate a shell script which knows about the PROJECT_SOURCE_DIR and PROJECT_BINARY_DIR of your project.

在您最外的 CMakeLists.txt 中添加以下代码:

In your outermost CMakeLists.txt add the following code:

configure_file(
    "${PROJECT_SOURCE_DIR}/gcc_debug_fix.sh.in"
    "${PROJECT_BINARY_DIR}/gcc_debug_fix.sh"
    @ONLY)

add_executable (MyExecutable ...)

set_target_properties(MyExecutable PROPERTIES 
    RULE_LAUNCH_COMPILE "${PROJECT_BINARY_DIR}/gcc_debug_fix.sh")

下面的模板shell脚本 gcc_debug_fix.sh.in 需要转到CMake项目的根目录: / p>

The following template shell script gcc_debug_fix.sh.in needs to go to the root directory of the CMake project:

#!/bin/sh

PROJECT_BINARY_DIR="@PROJECT_BINARY_DIR@"
PROJECT_SOURCE_DIR="@PROJECT_SOURCE_DIR@"

# shell script invoked with the following arguments
# $(CXX) $(CXX_DEFINES) $(CXX_FLAGS) -o OBJECT_FILE -c SOURCE_FILE

# extract parameters
SOURCE_FILE="${@: -1:1}"
OBJECT_FILE="${@: -3:1}"
COMPILER_AND_FLAGS=${@:1:$#-4}

# make source file path relative to project source dir
SOURCE_FILE_RELATIVE="${SOURCE_FILE:${#PROJECT_SOURCE_DIR} + 1}"

# make object file path absolute
OBJECT_FILE_ABSOLUTE="$PROJECT_BINARY_DIR/$OBJECT_FILE"

cd "$PROJECT_SOURCE_DIR"

# invoke compiler
exec $COMPILER_AND_FLAGS -c "${SOURCE_FILE_RELATIVE}" -o "${OBJECT_FILE_ABSOLUTE}"

使用变量 PROJECT_BINARY_DIR PROJECT_SOURCE_DIR 的信息将源文件的路径转换为相对于项目的路径root和目标文件的路径到绝对路径。因为gcc现在传递了一个项目相对路径,所以 .debug_str 也应该使用那个路径。

The shell script uses the information from the variables PROJECT_BINARY_DIR and PROJECT_SOURCE_DIR to transform the path of the source file to a path relative to the project root and the object file's path to an absolute path. Because gcc gets passed a project relative path now, .debug_str should use that path, too.

以下注意事项适用:


  • 请务必将可执行位 gcc_debug_fix.sh.in

  • 对于脚本工作 CMAKE_USE_RELATIVE_PATHS 再次设置为 OFF

  • 脚本对命令行中文件路径的位置做出假设。如果CMake使用不同的规则来调用编译器,这可能不起作用。一个更强大的解决方案是扫描 -o -c 标志的脚本参数。

  • Be sure to set the executable bit of gcc_debug_fix.sh.in.
  • For the script to work CMAKE_USE_RELATIVE_PATHS has to set to OFF again.
  • The script makes assumptions about the location of the file paths on the command line. This may not work if CMake uses a different rule to invoke the compiler. A more robust solution would be to scan the script arguments for the -o and -c flags.

这篇关于使gcc将相对文件名放在调试信息中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆