Как отключить все аргументы компиляции для команды кода компиляции GDB? - PullRequest
1 голос
/ 29 марта 2020

После этого процесса из предыдущего вопроса (см. Ответ).

GDB - огромное улучшение по сравнению с spim, но я хотел бы использовать функцию компиляции кода GDB, чтобы вводить произвольные инструкции MIPS в точке выполнения.

Я прочитал Компиляция и внедрение кода в GDB . Когда я запускаю команду compile code <anything>, я получаю сообщение об ошибке «Ошибка компиляции, нераспознанный аргумент -m32». Затем, когда я запускаю set debug compile в gdb и снова пытаюсь compile code <anything>, я вижу, что аргумент -m32 передается mips-linux-gnu-gcc.

Я попытался переопределить аргументы компиляции, используя set compile-args -march=mips32r3, который добавляет аргумент компиляции, но -m32 все еще передается и все равно выдает мне ошибку.

Как мне предотвратить передачу -m32? Есть ли чистый обходной путь (кроме создания фиктивного сценария, который перед компиляцией удаляет -m32)

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Как предотвратить передачу -m32?

Похоже, что это тот случай, когда разработчики GDB думали, что "GDB знает лучше", и не предоставили никакого способа чтобы переопределить это.

В частности, -m32 происходит от default_gcc_target_options(), что безоговорочно добавляет -m%d с gdb_arch_ptr_bit() в качестве аргумента.

За исключением построения вашей собственной GDB или предоставления обёртка G CC, которая удаляет -m32, я не вижу способа избавиться от этого аргумента.

0 голосов
/ 30 марта 2020

Сделайте этот скрипт, special-gcc. Сделайте его исполняемым, chmod 777 special-gcc. Сценарий использует exec для замены процесса вызовом gcc, в отличие от порождения дочернего процесса. Аргументы $@, хранятся в массиве, фильтруются в l oop, затем передаются в вызов 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, * Кажется, 1017 * неправильно связывает полученный файл .o. См. документы для получения подробной информации о внутренних функциях compile code. Где-то на этапах «Перемещение объектного файла» у меня произошел сбой процесса для mips-linux-gnu-gcc.

Однако это все еще чистый и простой способ точно контролировать аргументы компиляции, используемые gdb compile code.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...