From owner-svn-src-head@freebsd.org Fri Feb 1 20:28:17 2019 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id D186914BFBBB; Fri, 1 Feb 2019 20:28:16 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 756528025E; Fri, 1 Feb 2019 20:28:16 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3ABD223F98; Fri, 1 Feb 2019 20:28:16 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x11KSGBH071400; Fri, 1 Feb 2019 20:28:16 GMT (envelope-from emaste@FreeBSD.org) Received: (from emaste@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x11KSGKo071399; Fri, 1 Feb 2019 20:28:16 GMT (envelope-from emaste@FreeBSD.org) Message-Id: <201902012028.x11KSGKo071399@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: emaste set sender to emaste@FreeBSD.org using -f From: Ed Maste Date: Fri, 1 Feb 2019 20:28:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r343665 - head/contrib/elftoolchain/readelf X-SVN-Group: head X-SVN-Commit-Author: emaste X-SVN-Commit-Paths: head/contrib/elftoolchain/readelf X-SVN-Commit-Revision: 343665 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 756528025E X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.95 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.998,0]; NEURAL_HAM_SHORT(-0.95)[-0.950,0]; NEURAL_HAM_LONG(-1.00)[-0.999,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US] X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Feb 2019 20:28:17 -0000 Author: emaste Date: Fri Feb 1 20:28:15 2019 New Revision: 343665 URL: https://svnweb.freebsd.org/changeset/base/343665 Log: readelf: use table-based DT_FLAGS and DT_FLAGS_1 decoding Fewer lines of code and more maintainable. Reviewed by: brooks, kib MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D19053 Modified: head/contrib/elftoolchain/readelf/readelf.c Modified: head/contrib/elftoolchain/readelf/readelf.c ============================================================================== --- head/contrib/elftoolchain/readelf/readelf.c Fri Feb 1 18:19:33 2019 (r343664) +++ head/contrib/elftoolchain/readelf/readelf.c Fri Feb 1 20:28:15 2019 (r343665) @@ -220,6 +220,11 @@ struct mips_option { const char *desc; }; +struct flag_desc { + uint64_t flag; + const char *desc; +}; + static void add_dumpop(struct readelf *re, size_t si, const char *sn, int op, int t); static const char *aeabi_adv_simd_arch(uint64_t simd); @@ -293,8 +298,7 @@ static void dump_dwarf_ranges_foreach(struct readelf * static void dump_dwarf_str(struct readelf *re); static void dump_eflags(struct readelf *re, uint64_t e_flags); static void dump_elf(struct readelf *re); -static void dump_dt_flags_val(uint64_t d_val); -static void dump_dt_flags_1_val(uint64_t d_val); +static void dump_flags(struct flag_desc *fd, uint64_t flags); static void dump_dyn_val(struct readelf *re, GElf_Dyn *dyn, uint32_t stab); static void dump_dynamic(struct readelf *re); static void dump_liblist(struct readelf *re); @@ -2723,6 +2727,58 @@ dump_arch_dyn_val(struct readelf *re, GElf_Dyn *dyn) } static void +dump_flags(struct flag_desc *desc, uint64_t val) +{ + struct flag_desc *fd; + + for (fd = desc; fd->flag != 0; fd++) { + if (val & fd->flag) { + val &= ~fd->flag; + printf(" %s", fd->desc); + } + } + if (val != 0) + printf(" unknown (0x%jx)", (uintmax_t)val); +} + +static struct flag_desc dt_flags[] = { + { DF_ORIGIN, "ORIGIN" }, + { DF_SYMBOLIC, "SYMBOLIC" }, + { DF_TEXTREL, "TEXTREL" }, + { DF_BIND_NOW, "BIND_NOW" }, + { DF_STATIC_TLS, "STATIC_TLS" }, + { 0, NULL } +}; + +static struct flag_desc dt_flags_1[] = { + { DF_1_BIND_NOW, "NOW" }, + { DF_1_GLOBAL, "GLOBAL" }, + { 0x4, "GROUP" }, + { DF_1_NODELETE, "NODELETE" }, + { DF_1_LOADFLTR, "LOADFLTR" }, + { 0x20, "INITFIRST" }, + { DF_1_NOOPEN, "NOOPEN" }, + { DF_1_ORIGIN, "ORIGIN" }, + { 0x100, "DIRECT" }, + { DF_1_INTERPOSE, "INTERPOSE" }, + { DF_1_NODEFLIB, "NODEFLIB" }, + { 0x1000, "NODUMP" }, + { 0x2000, "CONFALT" }, + { 0x4000, "ENDFILTEE" }, + { 0x8000, "DISPRELDNE" }, + { 0x10000, "DISPRELPND" }, + { 0x20000, "NODIRECT" }, + { 0x40000, "IGNMULDEF" }, + { 0x80000, "NOKSYMS" }, + { 0x100000, "NOHDR" }, + { 0x200000, "EDITED" }, + { 0x400000, "NORELOC" }, + { 0x800000, "SYMINTPOSE" }, + { 0x1000000, "GLOBAUDIT" }, + { 0, NULL } +}; + +static void dump_dyn_val(struct readelf *re, GElf_Dyn *dyn, uint32_t stab) { const char *name; @@ -2807,146 +2863,14 @@ dump_dyn_val(struct readelf *re, GElf_Dyn *dyn, uint32 printf(" %s\n", timestamp(dyn->d_un.d_val)); break; case DT_FLAGS: - dump_dt_flags_val(dyn->d_un.d_val); + dump_flags(dt_flags, dyn->d_un.d_val); break; case DT_FLAGS_1: - dump_dt_flags_1_val(dyn->d_un.d_val); + dump_flags(dt_flags_1, dyn->d_un.d_val); break; default: printf("\n"); } -} - -static void -dump_dt_flags_val(uint64_t d_val) -{ - if (d_val & 0x1) { - d_val ^= 0x1; - printf(" ORIGIN"); - } - if (d_val & 0x2) { - d_val ^= 0x2; - printf(" SYMBOLIC"); - } - if (d_val & 0x4) { - d_val ^= 0x4; - printf(" TEXTREL"); - } - if (d_val & 0x8) { - d_val ^= 0x8; - printf(" BIND_NOW"); - } - if (d_val & 0x10) { - d_val ^= 0x10; - printf(" STATIC_TLS"); - } - if (d_val) - printf(" %jx", (uintmax_t)d_val); - printf("\n"); -} - -static void -dump_dt_flags_1_val(uint64_t d_val) -{ - if (d_val & 0x1) { - d_val ^= 0x1; - printf(" NOW"); - } - if (d_val & 0x2) { - d_val ^= 0x2; - printf(" GLOBAL"); - } - if (d_val & 0x4) { - d_val ^= 0x4; - printf(" GROUP"); - } - if (d_val & 0x8) { - d_val ^= 0x8; - printf(" NODELETE"); - } - if (d_val & 0x10) { - d_val ^= 0x10; - printf(" LOADFLTR"); - } - if (d_val & 0x20) { - d_val ^= 0x20; - printf(" INITFIRST"); - } - if (d_val & 0x40) { - d_val ^= 0x40; - printf(" NOOPEN"); - } - if (d_val & 0x80) { - d_val ^= 0x80; - printf(" ORIGIN"); - } - if (d_val & 0x100) { - d_val ^= 0x100; - printf(" DIRECT"); - } - if (d_val & 0x400) { - d_val ^= 0x400; - printf(" INTERPOSE"); - } - if (d_val & 0x800) { - d_val ^= 0x800; - printf(" NODEFLIB"); - } - if (d_val & 0x1000) { - d_val ^= 0x1000; - printf(" NODUMP"); - } - if (d_val & 0x2000) { - d_val ^= 0x2000; - printf(" CONFALT"); - } - if (d_val & 0x4000) { - d_val ^= 0x4000; - printf(" ENDFILTEE"); - } - if (d_val & 0x8000) { - d_val ^= 0x8000; - printf(" DISPRELDNE"); - } - if (d_val & 0x10000) { - d_val ^= 0x10000; - printf(" DISPRELPND"); - } - if (d_val & 0x20000) { - d_val ^= 0x20000; - printf(" NODIRECT"); - } - if (d_val & 0x40000) { - d_val ^= 0x40000; - printf(" IGNMULDEF"); - } - if (d_val & 0x80000) { - d_val ^= 0x80000; - printf(" NOKSYMS"); - } - if (d_val & 0x100000) { - d_val ^= 0x100000; - printf(" NOHDR"); - } - if (d_val & 0x200000) { - d_val ^= 0x200000; - printf(" EDITED"); - } - if (d_val & 0x400000) { - d_val ^= 0x400000; - printf(" NORELOC"); - } - if (d_val & 0x800000) { - d_val ^= 0x800000; - printf(" SYMINTPOSE"); - } - if (d_val & 0x1000000) { - d_val ^= 0x1000000; - printf(" GLOBAUDIT"); - } - if (d_val) - printf(" %jx", (uintmax_t)d_val); - printf("\n"); } static void