コード例 #1
0
    def test_compile_native_objects(self):
        s = self.getFakeSourceFile()
        with self.getTemp(suffix='.o') as obj:
            # TODO(dschuff): Use something more descriptive instead of -arch
            # (i.e. something that indicates that a translation is requested)
            # and remove pnacl-allow-translate
            driver_tools.RunDriver('clang', [
                s.name, '-c', '-o', obj.name, '--target=x86_64-unknown-nacl',
                '-arch', 'x86-64', '--pnacl-allow-translate'
            ])
            self.assertTrue(filetype.IsNativeObject(obj.name))
            self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'X8664')

            driver_tools.RunDriver('clang', [
                s.name, '-c', '-o', obj.name, '--target=i686-unknown-nacl',
                '-arch', 'x86-32', '--pnacl-allow-translate'
            ])
            self.assertTrue(filetype.IsNativeObject(obj.name))
            self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'X8632')

            driver_tools.RunDriver('clang', [
                s.name, '-c', '-o', obj.name,
                '--target=armv7-unknown-nacl-gnueabi', '-arch', 'arm',
                '--pnacl-allow-translate'
            ])
            self.assertTrue(filetype.IsNativeObject(obj.name))
            self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'ARM')

            # TODO(dschuff): This should be an error.
            driver_tools.RunDriver('clang', [
                s.name, '-c', '-o', obj.name, '--target=x86_64-unknown-nacl',
                '-arch', 'x86-32', '--pnacl-allow-translate'
            ])
            self.assertTrue(filetype.IsNativeObject(obj.name))
            self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'X8632')
コード例 #2
0
def ArchMerge(filename, must_match):
  file_type = filetype.FileType(filename)
  if file_type in ('o','so'):
    elfheader = elftools.GetELFHeader(filename)
    if not elfheader:
      Log.Fatal("%s: Cannot read ELF header", filename)
    new_arch = elfheader.arch
  elif filetype.IsNativeArchive(filename):
    new_arch = file_type[len('archive-'):]
  else:
    Log.Fatal('%s: Unexpected file type in ArchMerge', filename)

  existing_arch = GetArch()

  if not existing_arch:
    SetArch(new_arch)
    return True
  elif new_arch != existing_arch:
    if must_match:
      msg = "%s: Incompatible object file (%s != %s)"
      logfunc = Log.Fatal
    else:
      msg = "%s: Skipping incompatible object file (%s != %s)"
      logfunc = Log.Warning
    logfunc(msg, filename, new_arch, existing_arch)
    return False
  else: # existing_arch and new_arch == existing_arch
    return True
コード例 #3
0
def GetELFType(filename):
  """ ELF type as determined by ELF metadata """
  assert(elftools.IsELF(filename))
  elfheader = elftools.GetELFHeader(filename)
  elf_type_map = {
    'EXEC': 'nexe',
    'REL' : 'o',
    'DYN' : 'so'
  }
  return elf_type_map[elfheader.type]