From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 96565 invoked by alias); 2 Mar 2016 19:48:05 -0000 Mailing-List: contact gnu-gabi-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: gnu-gabi-owner@sourceware.org Received: (qmail 95832 invoked by uid 89); 2 Mar 2016 19:48:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.8 required=5.0 tests=AFFECTIONATE_BODY,AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 spammy=sk:note.gn, sk:notegn, sk:noteGN, sk:note.GN X-Spam-Status: No, score=-0.8 required=5.0 tests=AFFECTIONATE_BODY,AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: mail-qk0-f169.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to; bh=SiOGl5STCRwkmDpxCyBA4ye3hxuOVHJqJjEHGwpboz8=; b=Aw3kE+52vcmFYgBgzUY/2OfyxIJMf1Gh7on84s88EE510lZacw1kH86suR+LDuhYx5 3LJsWXuDuyhjwDfX35Hz2/DbEHHhDqhkj2qG6sjsaWytsD61CW1vPHxKQeMwMZ9nSKhj 4L0CO5OE34qhhuxDToWv+hJH9FML3E7BTWhBgCLfUPH1kweLUQ7hiN5buNCrdoTsOwld zYdwvVTE012KWoP8wcwn4T59ZaSAwdROqkpOVFIvcXbQkLwBpWm5tcPJlF6jiWqNU5x3 8wDogq3HUmTqN7Nj6aVBQMsfE1VWVdgkWivHqqzA2nYMPqiLMD76V/9SN9cqlY539SBs A5WA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to; bh=SiOGl5STCRwkmDpxCyBA4ye3hxuOVHJqJjEHGwpboz8=; b=lR+jLuiY+6Jl1EUfk8vBigmYJ1Pb28acZm3xfEnbbEohWQicz9YVhZ+hleGwkDWgvj +d4ZtFh3lzJp32hx8j/1mFz07Dzzk902X2JnExEm1TRf64rgxXFEjSkDtME+T9+fQYlj VFYBRQubzb6GTfMHem9iCh3ba3d9VDrywvpCsTNGPoAYhUHxdbzti46FK2l5VIPe7D+z qtnIH5k+kADRCQpC6Bpv1TE/GRF+pSel0ig+ONV+mOrljzF8LaCl9AKZqWIB9CziqOBv Zr+p1hlB8HlbMbuKBueasqxxOn+8j93CrUCAoM1bKI5Kt5jouQexFUNAxW8CaaTAyUaw YXvg== X-Gm-Message-State: AD7BkJJSR/nILan3o3fIp3CApm5QpdbIPx2zez/2U/ou6b1QFCbdSSNyatPA/pfXcomIpknxi16S9U5xjR8caA== MIME-Version: 1.0 X-Received: by 10.55.201.81 with SMTP id q78mr35604167qki.98.1456948071074; Wed, 02 Mar 2016 11:47:51 -0800 (PST) Date: Fri, 01 Jan 2016 00:00:00 -0000 Message-ID: Subject: RFC: Program Properties From: "H.J. Lu" To: gnu-gabi@sourceware.org Content-Type: text/plain; charset=UTF-8 X-SW-Source: 2016-q1/txt/msg00038.txt.bz2 There are cases where linker and run-time loader need more information about ELF objects beyond what the current gABI provides: 1. Minimum ISAs. Executables and shared objects, which are optimized specifically to run on a particular processor, will not run on processors which don't support the same set of ISAs. Since x86 only has EM_IAMCU, EM_386 and EM_X86_64 ELF machine codes, run-time loader needs additional information to tell if an executable or a shared object is compatible with available ISAs. 2. Stack size. Compilers may generate binaries which require larger stack size than normal. If run-time loader can query the stack size required by executable or shared object, it can increase stack size as needed. 3. Additional linking command line options embedded in relocatable object files: a. Additional libraries should be linked in when creating executable or shared object. http://sourceware.org/bugzilla/show_bug.cgi?id=12485 b. Additional compiler command line options are needed to properly link LTO objects. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41756 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47785 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54231 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53777 4. Relocatable object files compiled against header files from a specific version of a library must be linked with a compatible library when creating executable or shared object. GNU attributes GNU binutils supports build attribute and run-time platform compatibility data in relocatable object files. Issues with GNU attributes: 1. Many architectures, including x86, don't support GNU attributes: a. There are some overlaps between GNU attributes and program properties. b. GNU attributes may be extended to embed additional linking command line options in relocatable object files. 2. On x86, linking a relocatable object full of AVX instructions doesn't always make the resulting executables or shared libraries to require AVX to run since AVX functions may be called only via GNU_IFUNC at run-time. Linker can't set minimum ISAs just from ISAs used by input relocatable objects. 3. There is no program segment for GNU attributes in executables and shared objects. 4. Most of attributes aren't applicable to run-time loader. 5. The format of GNU attributes isn't optimal for run-time loader. A separate string table is used to store string attributes. gABI support for program properties To the "Special Sections" section, add: Name Type Attributes .note.GNU-properties SHT_NOTE SHF_ALLOC+SHF_GNU_PROPERTIES #define SHF_GNU_PROPERTIES 0x00100000 Each SHF_GNU_PROPERTIES section starts with a property header and followed by an array of properties. The property header has the following structure: typedef struct { Elf_Word ph_kind; unsigned char ph_padding[PH_PADDING]; Elf_SizeWord ph_propsz; } Elf_Prophdr; where ph_kind specifies the property kind: #define NT_GNU_PROPERTIES_HEADER_KIND 0x0 and PH_PADDING, if necessary, aligns ph_propsz to 8 or 4-byte alignment (depending on whether the file is a 64-bit or 32-bit object). Elf_SizeWord is Elf32_Word in the 32-bit object or Elf64_Xword in the 64-bit object. ph_propsz contains the size of the property array. Each array element represents one property with type, data size and data. In 64-bit objects, each element is an array of 8-byte words, whose first element is 4-byte type and data size, in the format of the target processor. In 32-bit objects, each element is an array of 4-byte words, whose first 2 elements are 4-byte type and data size, in the format of the target processor. An array element has the following structure: typedef struct { Elf_Word pr_type; Elf_Word pr_datasz unsigned char pr_data[PR_DATASZ]; unsigned char pr_padding[PR_PADDING]; } Elf_Prop; where PR_DATASZ is the data size and PR_PADDING, if necessary, aligns array element to 8 or 4-byte alignment (depending on whether the file is a 64-bit or 32-bit object). The array elements are sorted by the property type. The interpretation of property array depends on both ph_kind and pr_type. Types of program properties #define NT_GNU_PROPERTIES_LOPROC 0xb0000000 #define NT_GNU_PROPERTIES_HIPROC 0xdfffffff #define NT_GNU_PROPERTIES_LOUSER 0xe0000000 #define NT_GNU_PROPERTIES_HIUSER 0xffffffff To the "Program Header" section, add a segment type PT_GNU_PROPERTIES #define PT_GNU_PROPERTIES (PT_LOOS + 0x474e556) Program header should contain only one PT_GNU_PROPERTIES segment, which contains at least one .note.GNU-properties section. Proposed properties For NT_GNU_PROPERTIES_HEADER_KIND == 0: #define NT_GNU_PROPERTIES_STACK_SIZE 1 Integer value for minimum stack size. #define NT_GNU_PROPERTIES_REQUIRED_LIBRARY 2 String of the required library, NAMESPEC:SONAME. NAMESPEC is the string after the linker -l option. SONAME is DT_SONAME of the required library. #define NT_GNU_PROPERTIES_PROVIDED_LIBRARY 3 String of the provided library, NAMESPEC:SONAME. NAMESPEC is the string after the linker -l option. SONAME is DT_SONAME of the provided library. There is a conflict in linker inputs if 1. Any NT_GNU_PROPERTIES_REQUIRED_LIBRARY or NT_GNU_PROPERTIES_PROVIDED_LIBRARY have the same NAMESPEC, but different SONAMEs. 2. NAMESPEC in any NT_GNU_PROPERTIES_REQUIRED_LIBRARY matches an input libNAMESPEC.so whose DT_SONAME is different from SONAME. #define NT_GNU_PROPERTIES_GCC_OPTIONS 4 GCC options must be passed to GCC when used with GCC. #define NT_GNU_PROPERTIES_X86_ISA_1_USED 0xc0000000 The x86 instruction sets indicated by the corresponding bits are used in program. But their support in the hardware is optional. #define NT_GNU_PROPERTIES_X86_ISA_1_NEEDED 0xc0000001 The x86 instruction sets indicated by the corresponding bits are used in program and they must be supported by the hardware. A bit set in NT_GNU_PROPERTIES_X86_ISA_1_NEEDED must also be set in NT_GNU_PROPERTIES_X86_ISA_1_USED. Integer value for the x86 instruction set support. #define NT_GNU_PROPERTIES_X86_ISA_1_486 (1U << 0) #define NT_GNU_PROPERTIES_X86_ISA_1_586 (1U << 1) #define NT_GNU_PROPERTIES_X86_ISA_1_686 (1U << 2) #define NT_GNU_PROPERTIES_X86_ISA_1_SSE (1U << 3) #define NT_GNU_PROPERTIES_X86_ISA_1_SSE2 (1U << 4) #define NT_GNU_PROPERTIES_X86_ISA_1_SSE3 (1U << 5) #define NT_GNU_PROPERTIES_X86_ISA_1_SSSE3 (1U << 6) #define NT_GNU_PROPERTIES_X86_ISA_1_SSE4_1 (1U << 7) #define NT_GNU_PROPERTIES_X86_ISA_1_SSE4_2 (1U << 8) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX (1U << 9) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX2 (1U << 10) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX512F (1U << 11) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX512CD (1U << 12) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX512ER (1U << 13) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX512PF (1U << 14) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX512VL (1U << 15) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX512DQ (1U << 16) #define NT_GNU_PROPERTIES_X86_ISA_1_AVX512BW (1U << 17)