48int main( 
int argc, 
char* argv[] ) {
 
   49  auto& reg2 = Gaudi::PluginService::v2::Details::Registry::instance();
 
   52  using key_type = Gaudi::PluginService::v2::Details::Registry::KeyType;
 
   55  std::map<key_type, std::string> loaded;
 
   57  for ( 
const auto& name : reg2.loadedFactoryNames() ) loaded.emplace( name, 
"<preloaded>" );
 
   58  for ( 
const auto& name : reg1.loadedFactoryNames() ) loaded.emplace( name, 
"<preloaded>" );
 
   61  std::list<char*> libs;
 
   62  std::string      output_opt( 
"-" );
 
   64    std::string argv0( argv[0] );
 
   66      auto i = argv0.rfind( 
'/' );
 
   67      if ( i != std::string::npos ) argv0 = argv0.substr( i + 1 );
 
   72      const std::string arg( argv[i] );
 
   73      if ( arg == 
"-o" || arg == 
"--output" ) {
 
   77          std::cerr << 
"ERROR: missing argument for option " << arg << std::endl;
 
   78          std::cerr << 
"See `" << argv0 << 
" -h' for more details." << std::endl;
 
   81      } 
else if ( arg == 
"-h" || arg == 
"--help" ) {
 
   85        libs.push_back( argv[i] );
 
   96  std::unique_ptr<std::ostream> output_file;
 
   97  if ( output_opt != 
"-" ) { output_file.reset( 
new std::ofstream{ output_opt } ); }
 
   98  std::ostream& output = ( output_file ? *output_file : std::cout );
 
  100  auto dump_from = [&output, &loaded]( 
const auto& reg, 
const char* lib, 
const char* prefix ) {
 
  101    for ( 
const auto& factoryName : reg.loadedFactoryNames() ) {
 
  104      const auto& info = reg.factories().find( factoryName )->second;
 
  105      if ( lib != info.library && !info.library.empty() && info.library != 
"unknown" ) {
 
  106        std::cerr << 
"WARNING: library [" << lib << 
"] exposes factory [" << factoryName << 
"] which is declared in [" 
  107                  << info.library << 
"] !!" << std::endl;
 
  110      auto f = loaded.find( factoryName );
 
  111      if ( f == loaded.end() ) {
 
  112        output << prefix << 
"::" << lib << 
":" << factoryName << std::endl;
 
  113        loaded.emplace( factoryName, lib );
 
  115        std::cerr << 
"WARNING: factory '" << factoryName << 
"' already found in " << f->second << std::endl;
 
  120  for ( 
const char* lib : libs ) {
 
  121    if ( dlopen( lib, RTLD_LAZY | RTLD_LOCAL ) ) {
 
  122      dump_from( reg2, lib, 
"v2" );
 
  123      dump_from( reg1, lib, 
"v1" );
 
  125      std::cerr << 
"ERROR: failed to load " << lib << 
": " << dlerror() << std::endl;