Я не уверен, что это соответствует вашим потребностям, но вы можете сделать это (для двоичного файла без PIE, так что ссылка с -no-pie
):
.text
.global _start
_start:
/* exit */
mov $60, %rax
.Lmylabel:
mov [110], %rdi
syscall
.section .rodata
mylabel:
.long .Lmylabel
Затем, вы можете установить точка останова с использованием break *mylabel
(обратите внимание на *
):
(gdb) break *mylabel
Breakpoint 2 at 0x401007: file t.S, line 7.
Поскольку mylabel
является более или менее указателем на функцию, GDB ничего об этом не знает и будет игнорировать это:
С помощью сценария компоновщика должна быть возможность поместить символ mylabel
в раздел, который не загружен, чтобы уменьшить накладные расходы времени выполнения.
То, что я обычно делал (и сделал бы, если бы мне было нужно это снова), является попыткой создать экземпляр объекта класса, который Вы знаете, находится в библиотеке COM - или ProgID или GUID - и проверяющий на отказ.
Попытайтесь создать его и обработать ошибку если нет.
Под Win32 CoCreateInstance
возвратится REGDB_E_CLASSNOTREG
если не установленный (включая, IIRC, если зарегистрировано, но dll/exe реализация его затем удалена).
Под.NET сгенерированный взаимодействующий с COM блок бросит некоторую ошибку (должен проверить это, не имейте удобного кода для тестирования на который тип исключительной ситуации).Примечание. если interop блок будет отсутствовать затем, то это будут рассматривать как недостающий блок, возможно ведущий к ошибке загрузки приложения.