当前位置: 首页>>代码示例>>C++>>正文


C++ database::add_elf_rpath方法代码示例

本文整理汇总了C++中database::add_elf_rpath方法的典型用法代码示例。如果您正苦于以下问题:C++ database::add_elf_rpath方法的具体用法?C++ database::add_elf_rpath怎么用?C++ database::add_elf_rpath使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在database的用法示例。


在下文中一共展示了database::add_elf_rpath方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: image

// Loads an ELF image.
static void
load_elf(const symboldb_options &opt, database &db,
	 database::contents_id cid, const rpm_file_entry &file)
{
  try {
    // Used for error reporting.
    const char *elf_path = file.infos.front().name.c_str();

    elf_image image(file.contents.data(), file.contents.size());
    {
      elf_image::symbol_range symbols(image);
      while (symbols.next()) {
	if (symbols.definition()) {
	  dump_def(opt, db, cid, elf_path, *symbols.definition());
	} else if (symbols.reference()) {
	  dump_ref(opt, db, cid, elf_path, *symbols.reference());
	} else {
	  raise<std::logic_error>("unknown elf_symbol type");
	}
      }
    }
    std::string soname;
    bool soname_seen = false;
    {
      elf_image::dynamic_section_range dyn(image);
      while (dyn.next()) {
	switch (dyn.type()) {
	case elf_image::dynamic_section_range::needed:
	  db.add_elf_needed(cid, dyn.text().c_str());
	  break;
	case elf_image::dynamic_section_range::soname:
	  if (soname_seen) {
	    // The linker ignores some subsequent sonames, but
	    // not all of them.  Multiple sonames are rare.
	    if (dyn.text() != soname) {
	      std::ostringstream out;
	      out << "duplicate soname ignored: " << dyn.text()
		  << ", previous soname: " << soname;
	      db.add_elf_error(cid, out.str().c_str());
	    }
	  } else {
	    soname = dyn.text();
	    soname_seen = true;
	  }
	  break;
	case elf_image::dynamic_section_range::rpath:
	  db.add_elf_rpath(cid, dyn.text().c_str());
	  break;
	case elf_image::dynamic_section_range::runpath:
	  db.add_elf_runpath(cid, dyn.text().c_str());
	  break;
	case elf_image::dynamic_section_range::other:
	  {
	    long long tag = dyn.tag();
	    long long number = dyn.number();
	    // Skip NULL entries.
	    if (tag != 0 || number != 0) {
	      db.add_elf_dynamic(cid, dyn.tag(), dyn.number());
	    }
	  }
	  break;
	}
      }
    }
    // We used to derive the soname from the file name, but because of
    // hardlinks (and deduplication), we no longer can do this here.
    const char *sonameptr = soname_seen ? soname.c_str() : NULL;
    db.add_elf_image(cid, image, sonameptr);
  } catch (elf_exception e) {
    db.add_elf_error(cid, e.what());
  }
}
开发者ID:pombredanne,项目名称:symboldb,代码行数:73,代码来源:rpm_load.cpp


注:本文中的database::add_elf_rpath方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。