This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] Support forward exports in .def files
- From: Danny Smith <dannysmith at clear dot net dot nz>
- To: binutils at sources dot redhat dot com
- Cc: Filip Navara <xnavara at volny dot cz>
- Date: Wed, 25 Jan 2006 21:25:29 +1300
- Subject: Re: [PATCH] Support forward exports in .def files
- References: <4231AA68.50807@volny.cz>
- Reply-to: Danny Smith <dannysmith at users dot sourceforge dot net>
> Changelog:
>
> 2005-03-11 Filip Navara <navaraf@reactos.com>
>
> * ld/deffile.h, ld/pe-dll.c: Add support for forward exports
> in .def files passed directly to 'ld'.
> * ld/pe-dll.c (process_def_file): Don't crash on malformed
> fastcall symbol names in .def file.
>
When this patch was submitted, Filip was asked to complete FSF copyright
assignments.
The has been done (#231082).
Can this patch go in now?
Danny
> --- ld/deffile.h Sat Jun 28 07:28:54 2003
> +++ ld/deffile.h Fri Mar 11 13:41:13 2005
> @@ -36,7 +36,7 @@
> char *internal_name; /* always set, may == name */
> int ordinal; /* -1 if not specified */
> int hint;
> - char flag_private, flag_constant, flag_noname, flag_data;
> + char flag_private, flag_constant, flag_noname, flag_data, flag_forward;
> } def_file_export;
>
> typedef struct def_file_module {
> --- ld/pe-dll.c Sun Oct 24 03:00:12 2004
> +++ ld/pe-dll.c Fri Mar 11 14:36:31 2005
> @@ -596,8 +611,13 @@
> have. */
> int lead_at = (*pe_def_file->exports[i].name == '@');
> char *tmp = xstrdup (pe_def_file->exports[i].name + lead_at);
> + char *tmp_at = strchr (tmp, '@');
>
> - *(strchr (tmp, '@')) = 0;
> + if (tmp_at)
> + *tmp_at = 0;
> + else
> + einfo (_("%XCannot export %s: invalid export name\n"),
> + pe_def_file->exports[i].name);
> pe_def_file->exports[i].name = tmp;
> }
> }
> @@ -680,6 +700,27 @@
> {
> char *name;
>
> + /* Check for forward exports */
> + if (strchr (pe_def_file->exports[i].internal_name, '.'))
> + {
> + count_exported++;
> + if (!pe_def_file->exports[i].flag_noname)
> + count_exported_byname++;
> +
> + pe_def_file->exports[i].flag_forward = 1;
> +
> + if (pe_def_file->exports[i].ordinal != -1)
> + {
> + if (max_ordinal < pe_def_file->exports[i].ordinal)
> + max_ordinal = pe_def_file->exports[i].ordinal;
> + if (min_ordinal > pe_def_file->exports[i].ordinal)
> + min_ordinal = pe_def_file->exports[i].ordinal;
> + count_with_ordinals++;
> + }
> +
> + continue;
> + }
> +
> name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
> if (pe_details->underscored
> && (*pe_def_file->exports[i].internal_name != '@'))
> @@ -837,7 +878,8 @@
> /* Now we need to assign ordinals to those that don't have them. */
> for (i = 0; i < NE; i++)
> {
> - if (exported_symbol_sections[i])
> + if (exported_symbol_sections[i] ||
> + pe_def_file->exports[i].flag_forward)
> {
> if (pe_def_file->exports[i].ordinal != -1)
> {
> @@ -856,19 +898,26 @@
> }
> name_table_size += strlen (pe_def_file->exports[i].name) + 1;
> }
> +
> + /* Reserve space for the forward name. */
> + if (pe_def_file->exports[i].flag_forward)
> + {
> + name_table_size += strlen (pe_def_file->exports[i].internal_name) + 1;
> + }
> }
>
> next_ordinal = min_ordinal;
> for (i = 0; i < NE; i++)
> - if (exported_symbol_sections[i])
> - if (pe_def_file->exports[i].ordinal == -1)
> - {
> - while (exported_symbols[next_ordinal - min_ordinal] != -1)
> - next_ordinal++;
> + if ((exported_symbol_sections[i] ||
> + pe_def_file->exports[i].flag_forward) &&
> + pe_def_file->exports[i].ordinal == -1)
> + {
> + while (exported_symbols[next_ordinal - min_ordinal] != -1)
> + next_ordinal++;
>
> - exported_symbols[next_ordinal - min_ordinal] = i;
> - pe_def_file->exports[i].ordinal = next_ordinal;
> - }
> + exported_symbols[next_ordinal - min_ordinal] = i;
> + pe_def_file->exports[i].ordinal = next_ordinal;
> + }
>
> /* OK, now we can allocate some memory. */
> edata_sz = (40 /* directory */
> @@ -967,15 +1016,28 @@
> for (s = 0; s < NE; s++)
> {
> struct bfd_section *ssec = exported_symbol_sections[s];
> - if (ssec && pe_def_file->exports[s].ordinal != -1)
> + if (pe_def_file->exports[s].ordinal != -1 &&
> + (pe_def_file->exports[s].flag_forward || ssec != NULL))
> {
> - unsigned long srva = (exported_symbol_offsets[s]
> - + ssec->output_section->vma
> - + ssec->output_offset);
> int ord = pe_def_file->exports[s].ordinal;
>
> - bfd_put_32 (abfd, srva - image_base,
> - eaddresses + 4 * (ord - min_ordinal));
> + if (pe_def_file->exports[s].flag_forward)
> + {
> + bfd_put_32 (abfd, ERVA (enamestr),
> + eaddresses + 4 * (ord - min_ordinal));
> +
> + strcpy (enamestr, pe_def_file->exports[s].internal_name);
> + enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
> + }
> + else
> + {
> + unsigned long srva = (exported_symbol_offsets[s]
> + + ssec->output_section->vma
> + + ssec->output_offset);
> +
> + bfd_put_32 (abfd, srva - image_base,
> + eaddresses + 4 * (ord - min_ordinal));
> + }
>
> if (!pe_def_file->exports[s].flag_noname)
> {
>