X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f X-Recipient: djgpp AT delorie DOT com X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=Q4EerPe5xivYSMbrjV9nAoyT/mkmbsA/y2IsVanOmV4=; b=UGtaGDGmrQsqon2pW/mDyJ6V5l89aPOBIp8TNSWO56i+rESClCI3PR7iQ8eeccUNfl 4EqKukqrw7BOYKtfx/mN5GmywBGuvdrMhSvmKtJ1v/CWr4LSKIPOan0BVvqji1DIvm3b KHGJlFZ5W6qY1tNC2GK5H4aPbZu/1Qb0S0sqpE9LQFaYVITdf7toF+GvGMubDDlefi7n UixsislutqKBPN0QE/lFemiW7sBzLSqWqBTMEaNZRujn+ljPMaXljeRyoU9F2d7ly/ZB Pen+Hef4Zy2p/vO3O6YEaLKPvw4KEAU6zUdMcmhwrQ/bFCYLyrYdfOarjV0581XGUo8C /Gcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=Q4EerPe5xivYSMbrjV9nAoyT/mkmbsA/y2IsVanOmV4=; b=XS81qr2DSJLAtEdIA/wXWf0M1jeI2Kz4udL2JFFteFIbeUJgGl6ZEAshMpQqamfF6f aM8biCSmfBREVpV3cXHEgjdPZ6X5A2BnzwcqMxrcHZHWJdl6BS64MX/P+HptQ3bw0iXs YUmALudnxfboJjKSeVqS3GqbNGWkA5900nqnYE1C2yH6f1X05HSoUYATmSLq9bVtGg8u KYPIZ0QR3izyBIPnCj5w1fex9POxJgJ/yPFxLk5PZxaEPe2n6R5WzHKaac2/nMzHoGRa WoCRc7LRSd5U6NXPkv8dcVJT9UP/eQ2TxGnqf9Ttpwvjq8BDWD3nmpWFvrZFt+thoF/S WXzA== X-Gm-Message-State: AN3rC/49Je4CWbeGUNoa1lvluvsTkXEn+4rT7iv5JxhrGi1+33S5AKfU bfAozRzQ/kJtoRL3K9ILvjjOCKjvpw== X-Received: by 10.200.4.26 with SMTP id v26mr4702597qtg.251.1493372586541; Fri, 28 Apr 2017 02:43:06 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: From: "Ozkan Sezer (sezeroz AT gmail DOT com) [via djgpp AT delorie DOT com]" Date: Fri, 28 Apr 2017 12:43:06 +0300 Message-ID: Subject: Re: dxe3gen does not handle relocs > 65535 To: djgpp AT delorie DOT com Content-Type: text/plain; charset=UTF-8 Reply-To: djgpp AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk On 4/28/17, Ozkan Sezer wrote: > dxe3gen does not handle extended relocations, i.e. STYP_NRELOC_OVFL > set in hdr->s_flags: it still takes hdr->s_nreloc as number of relocs > and ends up generating a broken dxe which leads to bad crashes when > loaded. We have one such c++ project where s_nreloc does overflow. > > I will be trying a few things with this, but I'd appreciate help or > advice or links too: How should I read the actual number of relocs? > Would our current dlopen() still work with this? Here is a dirty draft (to be tested yet). Comments? Index: dxe3gen.c =================================================================== RCS file: /cvs/djgpp/djgpp/src/dxe/dxe3gen.c,v retrieving revision 1.23 diff -u -p -r1.23 dxe3gen.c --- dxe3gen.c 4 Oct 2015 10:27:26 -0000 1.23 +++ dxe3gen.c 28 Apr 2017 08:37:50 -0000 @@ -937,6 +937,7 @@ static int write_dxe(FILE *inf, FILE *ou char *strings; RELOC *relocs; unsigned int i, j, errcount; + ULONG32 real_nrelocs; size_t hdrsize; /* Exported symbols table */ @@ -953,7 +954,18 @@ static int write_dxe(FILE *inf, FILE *ou dh.magic = DXE_MAGIC; dh.element_size = -1; - dh.nrelocs = sc.s_nreloc; + if (sc.s_flags & STYP_NRELOC_OVFL) { + long pos = ftell(inf); + fseek(inf, sc.s_relptr, SEEK_SET); + /* r_vaddr is 1st member of struct external_reloc */ + fread(&real_nrelocs, 4, 1, inf); + fseek(inf, pos, SEEK_SET); + dh.nrelocs = --real_nrelocs; /* remove the '+1' */ + fprintf(stderr, "%s: real nrelocs: %u\n", progname, real_nrelocs); + } + else { + dh.nrelocs = real_nrelocs = sc.s_nreloc; + } dh.n_exp_syms = 0; dh.exp_table = sizeof(dh); dh.n_deps = opt.num_deps; @@ -985,9 +997,12 @@ static int write_dxe(FILE *inf, FILE *ou strings[0] = 0; /* Read the relocation table */ - relocs = (RELOC *)malloc(sc.s_nreloc * sizeof(RELOC)); + relocs = (RELOC *)malloc(real_nrelocs * sizeof(RELOC)); fseek(inf, sc.s_relptr, SEEK_SET); - fread(relocs, RELSZ, sc.s_nreloc, inf); + if (sc.s_flags & STYP_NRELOC_OVFL) { + fseek(inf, RELSZ, SEEK_CUR); /* skip the extra one. */ + } + fread(relocs, RELSZ, real_nrelocs, inf); /* Close input file */ fclose(inf); @@ -1042,7 +1057,7 @@ static int write_dxe(FILE *inf, FILE *ou int n_abs_relocs = 0, n_rel_relocs = 0; /* count the amount of relocations pointing to this symbol */ - for (j = 0; j < sc.s_nreloc; j++) + for (j = 0; j < real_nrelocs; j++) { if (relocs[j].r_symndx == i) { @@ -1101,7 +1116,7 @@ static int write_dxe(FILE *inf, FILE *ou unres_size = newsize; - for (j = 0; j < sc.s_nreloc; j++) + for (j = 0; j < real_nrelocs; j++) { if (relocs[j].r_symndx == i) { @@ -1202,7 +1217,7 @@ static int write_dxe(FILE *inf, FILE *ou /* Compute the amount of valid relocations */ DEBUG_PRINT_RELOCATION_DIRECTIVE_PROLOG(); - for (i = 0; i < sc.s_nreloc; i++) + for (i = 0; i < real_nrelocs; i++) { DEBUG_PRINT_RELOCATION_DIRECTIVE(i, relocs); if (!VALID_RELOC(relocs[i])) @@ -1278,7 +1293,7 @@ static int write_dxe(FILE *inf, FILE *ou free(data); /* Output the relocations */ - for (i = 0; i < sc.s_nreloc; i++) + for (i = 0; i < real_nrelocs; i++) { if (VALID_RELOC(relocs[i])) fwrite(&relocs[i].r_vaddr, 1, sizeof(relocs[0].r_vaddr), outf);