如何禁用 gdb 编译代码命令的所有编译参数?
How to disable all compilation arguments for gdb compile code command?
关注这个
来自较早的问题(参见答案)。
gdb 是对 spim 的巨大改进,但我想使用 gdb 的编译代码功能,在执行时注入任意 mips 指令。
我已阅读Compiling and injecting code in gdb。当我 运行 运行 compile code <anything>
时,我得到错误 "compilation failed, unrecognized argument -m32
"。然后当我在 gdb 中 运行 set debug compile
并再次尝试 compile code <anything>
时,我看到参数 -m32
被传递给 mips-linux-gnu-gcc
.
我尝试使用 set compile-args -march=mips32r3
覆盖编译参数,它添加了编译参数,但是 -m32
仍然通过并且仍然给我一个错误。
如何防止 -m32
被通过?是否有一个干净的解决方法(除了制作一个在编译前去除 -m32
的虚拟脚本?)
How do I prevent -m32 from being passed?
看起来这就是 GDB 开发人员认为 "GDB knows better" 并且没有提供任何方法来覆盖它的情况。
具体来说,-m32
来自 default_gcc_target_options()
,它无条件地将 -m%d
添加到 gdb_arch_ptr_bit()
作为参数。
如果没有构建您自己的 GDB 或提供剥离 -m32
的 GCC 包装器,我看不出有任何方法可以消除这种争论。
制作此脚本,special-gcc
。使其可执行,chmod 777 special-gcc
。该脚本使用 exec
将进程替换为 gcc
调用,而不是生成子进程。参数是 $@
,存储在数组中,在循环中过滤,然后传递给 gcc
调用。
#!/bin/bash
declare -a args=()
#!/bin/bash
echo -- "----------------" >> ~/gcc-wrapper-log
for arg in "$@"
do
if ! [[ "$arg" == '-m32' ]]; then
echo -- "$arg" >> ~/gcc-wrapper-log
args+=("$arg")
fi
done
exec mips-linux-gnu-gcc -static "${args[@]}"
在 gdb
内,运行 命令 set compile-gcc /path/to/special-gcc
。尝试一些命令 compile code <anything>
。然后在gcc-wrapper-log
你可以看到编译的所有参数,可以在脚本中选择性地禁用它们。
对我来说,编译成功了,但是因为我使用的是 mips-linux-gnu-gcc
交叉编译器二进制文件,gdb
似乎没有 link 正确地生成 .o
文件。有关 compile code
功能内部结构的详细信息,请参阅 the docs。步骤 "Relocating the object file" 中的某处是我 mips-linux-gnu-gcc
.
过程失败的地方
但是,这仍然是一种精确控制 gdb compile code
.
使用的编译参数的干净简单的方法
关注这个
gdb 是对 spim 的巨大改进,但我想使用 gdb 的编译代码功能,在执行时注入任意 mips 指令。
我已阅读Compiling and injecting code in gdb。当我 运行 运行 compile code <anything>
时,我得到错误 "compilation failed, unrecognized argument -m32
"。然后当我在 gdb 中 运行 set debug compile
并再次尝试 compile code <anything>
时,我看到参数 -m32
被传递给 mips-linux-gnu-gcc
.
我尝试使用 set compile-args -march=mips32r3
覆盖编译参数,它添加了编译参数,但是 -m32
仍然通过并且仍然给我一个错误。
如何防止 -m32
被通过?是否有一个干净的解决方法(除了制作一个在编译前去除 -m32
的虚拟脚本?)
How do I prevent -m32 from being passed?
看起来这就是 GDB 开发人员认为 "GDB knows better" 并且没有提供任何方法来覆盖它的情况。
具体来说,-m32
来自 default_gcc_target_options()
,它无条件地将 -m%d
添加到 gdb_arch_ptr_bit()
作为参数。
如果没有构建您自己的 GDB 或提供剥离 -m32
的 GCC 包装器,我看不出有任何方法可以消除这种争论。
制作此脚本,special-gcc
。使其可执行,chmod 777 special-gcc
。该脚本使用 exec
将进程替换为 gcc
调用,而不是生成子进程。参数是 $@
,存储在数组中,在循环中过滤,然后传递给 gcc
调用。
#!/bin/bash
declare -a args=()
#!/bin/bash
echo -- "----------------" >> ~/gcc-wrapper-log
for arg in "$@"
do
if ! [[ "$arg" == '-m32' ]]; then
echo -- "$arg" >> ~/gcc-wrapper-log
args+=("$arg")
fi
done
exec mips-linux-gnu-gcc -static "${args[@]}"
在 gdb
内,运行 命令 set compile-gcc /path/to/special-gcc
。尝试一些命令 compile code <anything>
。然后在gcc-wrapper-log
你可以看到编译的所有参数,可以在脚本中选择性地禁用它们。
对我来说,编译成功了,但是因为我使用的是 mips-linux-gnu-gcc
交叉编译器二进制文件,gdb
似乎没有 link 正确地生成 .o
文件。有关 compile code
功能内部结构的详细信息,请参阅 the docs。步骤 "Relocating the object file" 中的某处是我 mips-linux-gnu-gcc
.
但是,这仍然是一种精确控制 gdb compile code
.