@@ -2051,9 +2051,9 @@ static void usage(FILE *stream, const char *progname)
20512051 " \n "
20522052 " \t\t The default syntax is \" ATT\" .\n "
20532053 " \n "
2054- " \t --trap-all\n "
2055- " \t\t Insert a trap (int3) instruction at each trampoline entry. \n "
2056- " \t\t This can be used for debugging with gdb.\n "
2054+ " \t --trap=ADDR, --trap -all\n "
2055+ " \t\t Insert a trap (int3) instruction at the corresponding \n "
2056+ " \t\t trampoline entry. This can be used for debugging with gdb.\n "
20572057 " \n " , progname);
20582058}
20592059
@@ -2079,6 +2079,7 @@ enum Option
20792079 OPTION_STATIC_LOADER,
20802080 OPTION_SYNC,
20812081 OPTION_SYNTAX,
2082+ OPTION_TRAP,
20822083 OPTION_TRAP_ALL,
20832084};
20842085
@@ -2111,6 +2112,7 @@ int main(int argc, char **argv)
21112112 {" static-loader" , no_arg, nullptr , OPTION_STATIC_LOADER},
21122113 {" sync" , req_arg, nullptr , OPTION_SYNC},
21132114 {" syntax" , req_arg, nullptr , OPTION_SYNTAX},
2115+ {" trap" , req_arg, nullptr , OPTION_TRAP},
21142116 {" trap-all" , no_arg, nullptr , OPTION_TRAP_ALL},
21152117 {nullptr , no_arg, nullptr , 0 }
21162118 };
@@ -2123,6 +2125,7 @@ int main(int argc, char **argv)
21232125 bool option_executable = false , option_shared = false ,
21242126 option_static_loader = false ;
21252127 std::string option_start (" " ), option_end (" " ), option_backend (" ./e9patch" );
2128+ std::set<intptr_t > option_trap;
21262129 MatchExpr *option_match = nullptr ;
21272130 while (true )
21282131 {
@@ -2236,6 +2239,18 @@ int main(int argc, char **argv)
22362239 error (" bad value \" %s\" for `--syntax' option; "
22372240 " expected \" ATT\" or \" intel\" " , optarg);
22382241 break ;
2242+ case OPTION_TRAP:
2243+ {
2244+ errno = 0 ;
2245+ char *end = nullptr ;
2246+ unsigned long r = strtoul (optarg, &end, 0 );
2247+ if (errno != 0 || end == optarg ||
2248+ (end != nullptr && *end != ' \0 ' ) || r > INTPTR_MAX)
2249+ error (" bad value for \" %s\" for `--trap' option; "
2250+ " expected an address" , optarg);
2251+ option_trap.insert (r);
2252+ break ;
2253+ }
22392254 case OPTION_TRAP_ALL:
22402255 option_trap_all = true ;
22412256 break ;
@@ -2367,6 +2382,15 @@ int main(int argc, char **argv)
23672382 options.push_back (option);
23682383 if (options.size () > 0 )
23692384 sendOptionMessage (backend.out , options);
2385+ for (auto addr: option_trap)
2386+ {
2387+ options.clear ();
2388+ options.push_back (" --trap" );
2389+ std::string val;
2390+ val += std::to_string (addr);
2391+ options.push_back (val.c_str ());
2392+ sendOptionMessage (backend.out , options);
2393+ }
23702394
23712395 /*
23722396 * Initialize all plugins:
0 commit comments