From 21abaac89d67df7f992ecaf957ae2a0cacb46610 Mon Sep 17 00:00:00 2001 From: Hoa Nguyen Date: Tue, 1 Sep 2020 17:31:57 -0700 Subject: [PATCH] ext: Revert "base: Use system libelf instead of ext" This reverts commit bbb32ca1ef8eb8249cdca72be6171b94f61bd62e, which tells scons to use the system's libelf instead of ext/libelf. Signed-off-by: Hoa Nguyen Change-Id: I3bb3e62f2ef0fbc72983c221d5570edb4b35d157 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/33940 Reviewed-by: Gabe Black Maintainer: Gabe Black Tested-by: kokoro --- SConstruct | 4 - ext/libelf/SConscript | 139 ++++++++++++++++++++++++++++++++++ src/base/loader/elf_object.cc | 5 +- src/base/loader/elf_object.hh | 3 +- 4 files changed, 143 insertions(+), 8 deletions(-) create mode 100644 ext/libelf/SConscript diff --git a/SConstruct b/SConstruct index 4e47bdaeb..4ac134bbe 100755 --- a/SConstruct +++ b/SConstruct @@ -716,10 +716,6 @@ if not conf.CheckLibWithHeader('z', 'zlib.h', 'C++','zlibVersion();'): 'and/or zlib.h header file.\n' 'Please install zlib and try again.') -if not conf.CheckLibWithHeader('elf', 'gelf.h', 'C++', - 'elf_version(EV_CURRENT);'): - error('Did not find ELF access library libelf') - # If we have the protobuf compiler, also make sure we have the # development libraries. If the check passes, libprotobuf will be # automatically added to the LIBS environment variable. After diff --git a/ext/libelf/SConscript b/ext/libelf/SConscript new file mode 100644 index 000000000..45f809da9 --- /dev/null +++ b/ext/libelf/SConscript @@ -0,0 +1,139 @@ +# -*- mode:python -*- + +# Copyright (c) 2004-2005 The Regents of The University of Michigan +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Nathan Binkert + +from __future__ import print_function + +import os, subprocess + +Import('main') + +from m5.util import compareVersions + +elf_files = [] +def ElfFile(filename): + elf_files.append(File(filename)) + +ElfFile('elf_begin.c') +ElfFile('elf_cntl.c') +ElfFile('elf_data.c') +ElfFile('elf_end.c') +ElfFile('elf_errmsg.c') +ElfFile('elf_errno.c') +ElfFile('elf_fill.c') +ElfFile('elf_flag.c') +ElfFile('elf_getarhdr.c') +ElfFile('elf_getarsym.c') +ElfFile('elf_getbase.c') +ElfFile('elf_getident.c') +ElfFile('elf_hash.c') +ElfFile('elf_kind.c') +ElfFile('elf_memory.c') +ElfFile('elf_next.c') +ElfFile('elf_phnum.c') +ElfFile('elf_rand.c') +ElfFile('elf_rawfile.c') +ElfFile('elf_scn.c') +ElfFile('elf_shnum.c') +ElfFile('elf_shstrndx.c') +ElfFile('elf_strptr.c') +ElfFile('elf_update.c') +ElfFile('elf_version.c') +ElfFile('gelf_checksum.c') +ElfFile('gelf_dyn.c') +ElfFile('gelf_ehdr.c') +ElfFile('gelf_fsize.c') +ElfFile('gelf_getclass.c') +ElfFile('gelf_phdr.c') +ElfFile('gelf_rel.c') +ElfFile('gelf_rela.c') +ElfFile('gelf_shdr.c') +ElfFile('gelf_sym.c') +ElfFile('gelf_symshndx.c') +ElfFile('gelf_xlate.c') +ElfFile('libelf.c') +ElfFile('libelf_align.c') +ElfFile('libelf_allocate.c') +ElfFile('libelf_ar.c') +ElfFile('libelf_checksum.c') +ElfFile('libelf_data.c') +ElfFile('libelf_ehdr.c') +ElfFile('libelf_extended.c') +ElfFile('libelf_phdr.c') +ElfFile('libelf_shdr.c') +ElfFile('libelf_xlate.c') + +ElfFile('libelf_convert.c') +ElfFile('libelf_fsize.c') +ElfFile('libelf_msize.c') + +m4env = main.Clone() +if m4env['GCC']: + m4env.Append(CCFLAGS=['-Wno-pointer-sign', + '-Wno-unused-but-set-variable', + '-Wno-implicit-function-declaration', + '-Wno-override-init']) +if m4env['CLANG']: + m4env.Append(CCFLAGS=['-Wno-initializer-overrides', '-Wno-pointer-sign']) + # clang defaults to c99 (while gcc defaults to gnu89) and there is a + # difference in the handling of inlining functions which causes + # linking problems with multiple definitions of the symbols in + # sysmacros.h for older versions of glibc + m4env.Append(CCFLAGS=['-std=gnu89']) +m4env.Append(CCFLAGS=['-Wno-implicit']) +del m4env['CPPPATH'] + +# If we have gm4 use it +if m4env.Detect('gm4'): + m4env['M4'] = 'gm4' + +# Check that m4 is available +import SCons.Tool.m4 +if not SCons.Tool.m4.exists(m4env): + print("Error: Can't find version of M4 macro processor. " + + "Please install M4 and try again.") + Exit(1) + +m4env.Append(M4FLAGS=['-DSRCDIR=%s' % Dir('.').path]) +m4env['M4COM'] = '$M4 $M4FLAGS $SOURCES > $TARGET' +m4env.M4(target=File('libelf_convert.c'), + source=[File('elf_types.m4'), File('libelf_convert.m4')]) +m4env.M4(target=File('libelf_fsize.c'), + source=[File('elf_types.m4'), File('libelf_fsize.m4')]) +m4env.M4(target=File('libelf_msize.c'), + source=[File('elf_types.m4'), File('libelf_msize.m4')]) + +# Build libelf as a static library with PIC code so it can be linked +# into either m5 or the library +m4env.Library('elf', [m4env.SharedObject(f) for f in elf_files]) + +main.Prepend(CPPPATH=Dir('.')) +main.Append(LIBS=['elf']) +main.Prepend(LIBPATH=[Dir('.')]) + diff --git a/src/base/loader/elf_object.cc b/src/base/loader/elf_object.cc index 983d5e257..49fbd6dd7 100644 --- a/src/base/loader/elf_object.cc +++ b/src/base/loader/elf_object.cc @@ -41,7 +41,6 @@ #include "base/loader/elf_object.hh" #include -#include #include #include #include @@ -55,6 +54,7 @@ #include "base/logging.hh" #include "base/trace.hh" #include "debug/Loader.hh" +#include "gelf.h" #include "sim/byteswap.hh" namespace Loader @@ -221,7 +221,8 @@ ElfObject::determineArch() auto &edata = ehdr.e_ident[EI_DATA]; // Detect the architecture - if ((emach == EM_SPARC && eclass == ELFCLASS64) || emach == EM_SPARCV9) { + if (emach == EM_SPARC64 || (emach == EM_SPARC && eclass == ELFCLASS64) || + emach == EM_SPARCV9) { arch = SPARC64; } else if (emach == EM_SPARC32PLUS || (emach == EM_SPARC && eclass == ELFCLASS32)) { diff --git a/src/base/loader/elf_object.hh b/src/base/loader/elf_object.hh index 70271bb77..c262912af 100644 --- a/src/base/loader/elf_object.hh +++ b/src/base/loader/elf_object.hh @@ -41,12 +41,11 @@ #ifndef __BASE_LOADER_ELF_OBJECT_HH__ #define __BASE_LOADER_ELF_OBJECT_HH__ -#include - #include #include #include "base/loader/object_file.hh" +#include "gelf.h" namespace Loader { -- 2.30.2