From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20223 invoked by alias); 12 Oct 2016 18:04:00 -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 20200 invoked by uid 89); 12 Oct 2016 18:03:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.2 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.7 required=5.0 tests=AFFECTIONATE_BODY,AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=0xc0000000, Properties, descsz, Sections X-Spam-Status: No, score=0.7 required=5.0 tests=AFFECTIONATE_BODY,AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_SORBS_SPAM,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-qt0-f170.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to; bh=dNhnXWMNcHG42drsZ5ZUCf7qDuoYnYfbt2P1sFU1GbE=; b=pDMIVpHjz2wD3FqVkRWiffj1Ygy947b34LLsx/FqTPOdQ3TyU3z+RzPVOncF67/Wsn fUEhv4rd4J6RFbBj17K5+VOuayYvuKwSODx3Jo0N5AjMkB3ksDuonvA/5QRGycXRbi0T lAoFkdKM+wdv/oP+fdo8+LX8fgHf5Eux0B9UP3Vn0eAFI09X+jZfMk1ELOTtDwRQzXB8 AAPabAEbbIHjDkly6aeLk3rnR4CFls3B0jf2eivum3yLUKWmIXv+0c5y1ROe3GxbhJFt pxY9hSnoK/w4j6ebZxbR4U8hWbkt1GnvyF8Z4OGFIaNWWtradKBmmw9ZPXYYeE7aR+2r DY2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=dNhnXWMNcHG42drsZ5ZUCf7qDuoYnYfbt2P1sFU1GbE=; b=PEoMYQgpQedA1EJHe4UFShDMmdihnc75CmeMJG081VcWWVMulpEvnjy1n79YKh1QCE 9v0ohbvuR5hn4gCTZtoqGY5tFlmcRDbu6se/zm4woGVeCMZDVmU0INKw/2/cfHg9cH31 QgLtTh3Aa+aNBIVqqhVYsKj3vU7TgH7FjkqzeIGfshh9bZf+36cm2uasfEjTl6aD8ZHf IpcBN1PW5705hfj7IqMQA5ELKyLm57AyU0tt5PLnNKZSiCGAU0u2BkAWzeKTxPIeY8hy t8EZxczR0gKh+8vREivz71OZ9At1xeJbpC9M0fxau7aEOUq/aPEXj4l2kGJlG282Hxds 1bVQ== X-Gm-Message-State: AA6/9RkX+RlLlVWdIvMLyT/b4dmuCTNlUUtTKsswEAhZsCk6wPRfjCGsjRddUoazupTzKBbWa0zqEdA7bV0hMQ== X-Received: by 10.200.37.204 with SMTP id f12mr2573155qtf.123.1476295436147; Wed, 12 Oct 2016 11:03:56 -0700 (PDT) MIME-Version: 1.0 From: "H.J. Lu" Date: Fri, 01 Jan 2016 00:00:00 -0000 Message-ID: Subject: RFC: Program Properties To: gnu-gabi@sourceware.org Content-Type: text/plain; charset=UTF-8 X-SW-Source: 2016-q4/txt/msg00000.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. Copy relocation and protected visibility are fundamentally incompatible. On one hand, copy relocation is the part of the psABI and is used to access global data defined in a shared object from the executable. It moves the definition of global data, which is defined in a share object, to the executable at run-time. On the other hand, protected visibility indicates that a symbol is defined locally in the shared object at run-time. Both can't be true at the same time. The current solution is to make protected symbol more or less like normal symbol, which prevents optimizing local access to protected symbol within the 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. 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.property.0 SHT_NOTE SHF_ALLOC A .note.GNU-properties section contains a property note descriptor, starting with a property note descriptor header and followed by an array of properties. It can be merged with other SHT_NOTE sections. The property note descriptor header has the following structure: typedef struct { Elf_Word namsz; Elf_Word descsz; Elf_Word type; unsigned char name[4]; } Elf_GNU_Notehdr; 1. namesz is 4. 2. descsz contains the size of the property array. 3. type specifies the property type: #define NT_GNU_PROPERTY_TYPE_0 5 4. name is a null-terminated character string. It should be "GNU". 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 GNU_PROPERTY_LOPROC 0xb0000000 #define GNU_PROPERTY_HIPROC 0xdfffffff #define GNU_PROPERTY_LOUSER 0xe0000000 #define GNU_PROPERTY_HIUSER 0xffffffff Proposed properties For NT_GNU_PROPERTY_TYPE_0: #define GNU_PROPERTY_STACK_SIZE 1 Integer value for minimum stack size. #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 This indicates that there should be no copy relocations against protected data symbols. If a relocatable object contains this property, linker should treat protected data symbol as defined locally at run-time and copy this property to the output share object. Run-time loader should disallow copy relocations against protected data symbols defined in share objects with GNU_PROPERTY_NO_COPY_ON_PROTECTED property. #define GNU_PROPERTY_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 GNU_PROPERTY_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 GNU_PROPERTY_X86_ISA_1_NEEDED must also be set in GNU_PROPERTY_X86_ISA_1_USED. Integer value for the x86 instruction set support. #define GNU_PROPERTY_X86_ISA_1_486 (1U << 0) #define GNU_PROPERTY_X86_ISA_1_586 (1U << 1) #define GNU_PROPERTY_X86_ISA_1_686 (1U << 2) #define GNU_PROPERTY_X86_ISA_1_SSE (1U << 3) #define GNU_PROPERTY_X86_ISA_1_SSE2 (1U << 4) #define GNU_PROPERTY_X86_ISA_1_SSE3 (1U << 5) #define GNU_PROPERTY_X86_ISA_1_SSSE3 (1U << 6) #define GNU_PROPERTY_X86_ISA_1_SSE4_1 (1U << 7) #define GNU_PROPERTY_X86_ISA_1_SSE4_2 (1U << 8) #define GNU_PROPERTY_X86_ISA_1_AVX (1U << 9) #define GNU_PROPERTY_X86_ISA_1_AVX2 (1U << 10) #define GNU_PROPERTY_X86_ISA_1_AVX512F (1U << 11) #define GNU_PROPERTY_X86_ISA_1_AVX512CD (1U << 12) #define GNU_PROPERTY_X86_ISA_1_AVX512ER (1U << 13) #define GNU_PROPERTY_X86_ISA_1_AVX512PF (1U << 14) #define GNU_PROPERTY_X86_ISA_1_AVX512VL (1U << 15) #define GNU_PROPERTY_X86_ISA_1_AVX512DQ (1U << 16) #define GNU_PROPERTY_X86_ISA_1_AVX512BW (1U << 17) -- H.J.