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=VoQ0nvwkiVPQWih0V5J8kBSKKIrYhGiHateMYJD+Hqc=; b=SwXlqwdpnaBfnCSWiOFtwGrirMxDPZvYQ1ZtVW0IBPs413texQ5cd2tNbN2agCY3c5 k5yU4H6gqSL3uYPwNOIRQBLzy7YX2D6M4aAR7yJEqFtQncskj4vCG6NYt9kLPIkt4Z67 ULWjQUMy2YaQJMovo/CwjES3FcZ9j/Pa3BeAUiVhENLz5kOTa1r1HScILIhM5dAQwOqa YMDo6Vljzc1wPMsToXXcirDk/BbxCNQCvRd5D1kd5/hiLFi5OCFk34B4ADzywoQsqtxj XsPr8m728oHzQuOv3xOZmD/OYEn8VPDl6pe/IDbEvnP4NOXuoywSwGYPZV9QlsHLw6jZ 8GEg== 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=VoQ0nvwkiVPQWih0V5J8kBSKKIrYhGiHateMYJD+Hqc=; b=XsczUxPOaLuLDcRzg39G5tZaIHHA7kR6Rg/S6aEA2Bg50HoEy8ubQVdTERmDyeGYmO z1cfwfHQKa14sO/e/vE3OhIb2FMjtL8lNhzw5iipUfty3JK4inOSXNkOOWNLbf3l44NZ pN+D3GnSCsHE0TugS3aa5yHiAZG3ND6YHFuceFHicO2Pt4BeGwV4THA1C5IZe7cEPE+B 1bwHdCSvmMPdhynm3XPYllBsBVqXHJOPq9YJ1FMsiynPSD8rqS/KZ/PUjelCdhcg2jKI O7dCqbWAkrzFq6nv/7fg3DTg4PECz739/zKjvIKZGuhrZwXSymqejQEQuOzXxm1cVHUZ G+2w== X-Gm-Message-State: AN3rC/5tEVMOsrbJMst80CeBzWzZ4DcP2Iw+kzvw9zObCn28Jqx/DtAJ KCY482jsUV3YpH/FMM5MI1lZq9LkzQ== X-Received: by 10.237.33.69 with SMTP id 63mr2313198qtc.251.1493407240268; Fri, 28 Apr 2017 12:20:40 -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 22:20:39 +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: > On 4/28/17, Ozkan Sezer wrote: >> 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? [...] > > Just tested the above patch by generating out dxe and loading > and running with it: works fine for me. > Here is a somewhat cleaned-up patch with a changelog entry: dxe3gen.c: handle extended relocations. bump version to 1.0.4. Index: src/docs/kb/wc206.txi =================================================================== RCS file: /cvs/djgpp/djgpp/src/docs/kb/wc206.txi,v retrieving revision 1.3 diff -u -p -r1.3 wc206.txi --- src/docs/kb/wc206.txi 26 Apr 2017 11:46:19 -0000 1.3 +++ src/docs/kb/wc206.txi 28 Apr 2017 18:11:10 -0000 @@ -3,6 +3,9 @@ Here is a list of changes from DJGPP V2.05 to DJGPP V2.06 +@cindex dxe3gen and extended coff relocations +dxe3gen now handles extended coff relocations (more than 65535 relocs.) + @cindex Update of DXE linker script The dxe linker script, dxe.ld, now handles @code{.gnu.linkonce.b.*} and @code{.bss.*} sections. Index: src/dxe/dxe3gen.c =================================================================== RCS file: /cvs/djgpp/djgpp/src/dxe/dxe3gen.c,v retrieving revision 1.23 diff -u -p -r1.23 dxe3gen.c --- src/dxe/dxe3gen.c 4 Oct 2015 10:27:26 -0000 1.23 +++ src/dxe/dxe3gen.c 28 Apr 2017 18:11:10 -0000 @@ -193,7 +193,7 @@ #include "../../include/sys/dxe.h" #include "../../include/coff.h" -#define VERSION "1.0.3" +#define VERSION "1.0.4" #define TEMP_BASE "dxe_tmp" /* 7 chars, 1 char suffix */ #define TEMP_O_FILE TEMP_BASE".o" @@ -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 */ @@ -985,9 +986,18 @@ static int write_dxe(FILE *inf, FILE *ou strings[0] = 0; /* Read the relocation table */ - relocs = (RELOC *)malloc(sc.s_nreloc * sizeof(RELOC)); fseek(inf, sc.s_relptr, SEEK_SET); - fread(relocs, RELSZ, sc.s_nreloc, inf); + if (sc.s_flags & STYP_NRELOC_OVFL) { + fread(&real_nrelocs, 4, 1, inf); /* read r_vaddr */ + fseek(inf, RELSZ - 4, SEEK_CUR); /* skip the rest */ + dh.nrelocs = --real_nrelocs; /* lose the '+1' */ + if (opt.verbose) + printf("%s: real nrelocs: %lu\n", progname, (unsigned long)real_nrelocs); + } else { + real_nrelocs = dh.nrelocs; + } + relocs = (RELOC *)malloc(real_nrelocs * sizeof(RELOC)); + fread(relocs, RELSZ, real_nrelocs, inf); /* Close input file */ fclose(inf); @@ -1042,7 +1052,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 +1111,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 +1212,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 +1288,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); Any gotchas anyone can notice? Any comments and/or suggestions? Should apply to CVS? -- O.S.