125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Accumulation of various pieces of knowledge about ELF.
203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   Copyright (C) 2000-2012, 2014 Red Hat, Inc.
303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   This file is part of elfutils.
425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Written by Ulrich Drepper <drepper@redhat.com>, 2000.
525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   This file is free software; you can redistribute it and/or modify
703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   it under the terms of either
825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes     * the GNU Lesser General Public License as published by the Free
1003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       Software Foundation; either version 3 of the License, or (at
1103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       your option) any later version
1203333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1303333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   or
1403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes     * the GNU General Public License as published by the Free
1603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       Software Foundation; either version 2 of the License, or (at
1703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       your option) any later version
1803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
1903333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   or both in parallel, as here.
2003333823c75a1c1887e923828113a1b0fd12020cElliott Hughes
2103333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   elfutils is distributed in the hope that it will be useful, but
2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
2325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   General Public License for more details.
2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
2603333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   You should have received copies of the GNU General Public License and
2703333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   the GNU Lesser General Public License along with this program.  If
2803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes   not, see <http://www.gnu.org/licenses/>.  */
2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef _ELF_KNOWLEDGE_H
3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define _ELF_KNOWLEDGE_H	1
3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include <stdbool.h>
3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng
3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Test whether a section can be stripped or not.  */
3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SECTION_STRIP_P(shdr, name, remove_comment) \
3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng  /* Sections which are allocated are not removed.  */			      \
3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng  (((shdr)->sh_flags & SHF_ALLOC) == 0					      \
4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   /* We never remove .note sections.  */				      \
4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   && (shdr)->sh_type != SHT_NOTE					      \
4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   && (((shdr)->sh_type) != SHT_PROGBITS				      \
4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng       /* Never remove .gnu.warning.* sections.  */			      \
4403333823c75a1c1887e923828113a1b0fd12020cElliott Hughes       || (name != NULL							      \
4503333823c75a1c1887e923828113a1b0fd12020cElliott Hughes	   && strncmp (name, ".gnu.warning.", sizeof ".gnu.warning." - 1) != 0\
4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng	   /* We remove .comment sections only if explicitly told to do so. */\
4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng	   && (remove_comment						      \
4803333823c75a1c1887e923828113a1b0fd12020cElliott Hughes	       || strcmp (name, ".comment") != 0))))
4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Test whether `sh_info' field in section header contains a section
5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   index.  There are two kinds of sections doing this:
5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   - the sections containing relocation information reference in this
5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng     field the section to which the relocations apply;
5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   - section with the SHF_INFO_LINK flag set to signal that `sh_info'
5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng     references a section.  This allows correct handling of unknown
5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng     sections.  */
6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SH_INFO_LINK_P(Shdr) \
6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((Shdr)->sh_type == SHT_REL || (Shdr)->sh_type == SHT_RELA		      \
6225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   || ((Shdr)->sh_flags & SHF_INFO_LINK) != 0)
6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* When combining ELF section flags we must distinguish two kinds:
6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng
6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   - flags which cause problem if not added to the result even if not
6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng     present in all input sections
6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   - flags which cause problem if added to the result if not present
7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng     in all input sections
7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng
7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   The following definition is for the general case.  There might be
7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   machine specific extensions.  */
7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SH_FLAGS_COMBINE(Flags1, Flags2) \
7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  (((Flags1 | Flags2)							      \
7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng    & (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_LINK_ORDER		      \
7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng       | SHF_OS_NONCONFORMING | SHF_GROUP))				      \
7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng   | (Flags1 & Flags2 & (SHF_MERGE | SHF_STRINGS | SHF_INFO_LINK)))
8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Similar macro: return the bits of the flags which necessarily must
8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   match if two sections are automatically combined.  Sections still
8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng   can be forcefully combined in which case SH_FLAGS_COMBINE can be
8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   used to determine the combined flags.  */
8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SH_FLAGS_IMPORTANT(Flags) \
8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((Flags) & ~((GElf_Xword) 0 | SHF_LINK_ORDER | SHF_OS_NONCONFORMING))
8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng
8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng/* Size of an entry in the hash table.  The ELF specification says all
9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng   entries are regardless of platform 32-bits in size.  Early 64-bit
9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   ports (namely Alpha for Linux) got this wrong.  The wording was not
9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng   clear.
9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Several years later the ABI for the 64-bit S390s was developed.
9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng   Many things were copied from the IA-64 ABI (which uses the correct
9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng   32-bit entry size) but what do these people do?  They use 64-bit
9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng   entries.  It is really shocking to see what kind of morons are out
9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng   there.  And even worse: they are allowed to design ABIs.  */
9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define SH_ENTSIZE_HASH(Ehdr) \
10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng  ((Ehdr)->e_machine == EM_ALPHA					      \
10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng   || ((Ehdr)->e_machine == EM_S390					      \
10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng       && (Ehdr)->e_ident[EI_CLASS] == ELFCLASS64) ? 8 : 4)
10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng
10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif	/* elf-knowledge.h */
105