lkml.org 
[lkml]   [2024]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 3/4] selftests/arm: Add elf test
    Date
    This patch introduces an ELF parsing test; the 5th byte of the ELF header
    must be 0x01 for a 32-bit process. A basic sanity check is required to ensure
    that we are actually testing a 32-bit build.

    Signed-off-by: Dev Jain <dev.jain@arm.com>
    ---
    tools/testing/selftests/arm/elf/parse_elf.c | 74 +++++++++++++++++++++
    1 file changed, 74 insertions(+)
    create mode 100644 tools/testing/selftests/arm/elf/parse_elf.c

    diff --git a/tools/testing/selftests/arm/elf/parse_elf.c b/tools/testing/selftests/arm/elf/parse_elf.c
    new file mode 100644
    index 000000000000..86a2ec88b47d
    --- /dev/null
    +++ b/tools/testing/selftests/arm/elf/parse_elf.c
    @@ -0,0 +1,74 @@
    +// SPDX-License-Identifier: GPL-2.0
    +/*
    + * Copyright (C) 2024 ARM Limited
    + *
    + * Author : Dev Jain <dev.jain@arm.com>
    + *
    + * Parse elf header to confirm 32-bit process
    + */
    +
    +#define _GNU_SOURCE
    +#include <stdio.h>
    +#include <unistd.h>
    +#include <stdlib.h>
    +#include <elf.h>
    +#include <stdint.h>
    +
    +#include <kselftest.h>
    +
    +/* The ELF file header. This appears at the start of every ELF file. */
    +
    +struct elf_header {
    + unsigned char e_ident[16]; /* Magic number and other info */
    + uint16_t e_type; /* Object file type */
    + uint16_t e_machine; /* Architecture */
    + uint32_t e_version; /* Object file version */
    + uint64_t e_entry; /* Entry point virtual address */
    + uint64_t e_phoff; /* Program header table file offset */
    + uint64_t e_shoff; /* Section header table file offset */
    + uint32_t e_flags; /* Processor-specific flags */
    + uint16_t e_ehsize; /* ELF header size in bytes */
    + uint16_t e_phentsize; /* Program header table entry size */
    + uint16_t e_phnum; /* Program header table entry count */
    + uint16_t e_shentsize; /* Section header table entry size */
    + uint16_t e_shnum; /* Section header table entry count */
    + uint16_t e_shstrndx; /* Section header string table index */
    +};
    +
    +static int read_elf_header(const char *elfFile)
    +{
    + struct elf_header header;
    + FILE *file;
    + int ret = -1;
    +
    + file = fopen(elfFile, "r");
    + if (file) {
    +
    + /* store header in struct */
    + fread(&header, 1, sizeof(header), file);
    + fclose(file);
    +
    + /* sanity check: does it really follow ELF format */
    + if (header.e_ident[0] == 0x7f &&
    + header.e_ident[1] == 'E' &&
    + header.e_ident[2] == 'L' &&
    + header.e_ident[3] == 'F') {
    + if (header.e_ident[4] == 0x01)
    + ret = 0;
    + } else {
    + ksft_print_msg("Cannot parse /proc/self/exe\n");
    + }
    + } else {
    + ksft_print_msg("Cannot open /proc/self/exe\n");
    + }
    + return ret;
    +}
    +
    +int main(int argc, char *argv[])
    +{
    + ksft_print_header();
    + ksft_set_plan(1);
    +
    + ksft_test_result(read_elf_header("/proc/self/exe") == 0, "ELF is 32 bit\n");
    + ksft_finished();
    +}
    --
    2.39.2

    \
     
     \ /
      Last update: 2024-05-27 17:55    [W:2.710 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site