* dlltool.c (dump_iat): Remove unused function.

(gen_exp_file): Remove #if 0'd code.
	(make_one_lib_file): Likewise.
	* srconv.c: Remove #if 0'd code throughout.
	* size.c (lprint_number): Remove.
	(print_berkeley_format): Remove #if 0'd code.
	* ar.c (do_quick_append): Remove declaration and definiton.
	(main): Remove #if 0'd code.
	* filemode.c (filemodestring): Remove #if 0'd function.
	* sysdump.c (unit_info_list): Remove function.
	(object_body_list): Likewise.
	(program_structure): Likewise.
	(debug_list): Likewise.
	(module): Remove #if 0'd code.
This commit is contained in:
Ben Elliston
2005-01-21 05:40:24 +00:00
parent 7a64f7b8d6
commit 84e43642e3
7 changed files with 357 additions and 851 deletions

View File

@ -694,9 +694,6 @@ static void generate_idata_ofile (FILE *);
static void assemble_file (const char *, const char *);
static void gen_exp_file (void);
static const char *xlate (const char *);
#if 0
static void dump_iat (FILE *, export_type *);
#endif
static char *make_label (const char *, const char *);
static char *make_imp_label (const char *, const char *);
static bfd *make_one_lib_file (export_type *, int);
@ -1815,14 +1812,6 @@ gen_exp_file (void)
{
if (exp->ordinal != i)
{
#if 0
fprintf (f, "\t%s\t%d\t%s %d..%d missing\n",
ASM_SPACE,
(exp->ordinal - i) * 4,
ASM_C,
i, exp->ordinal - 1);
i = exp->ordinal;
#endif
while (i < exp->ordinal)
{
fprintf(f,"\t%s\t0\n", ASM_LONG);
@ -2034,29 +2023,6 @@ xlate (const char *name)
return name;
}
/**********************************************************************/
#if 0
static void
dump_iat (FILE *f, export_type *exp)
{
if (exp->noname && !show_allnames )
{
fprintf (f, "\t%s\t0x%08x\n",
ASM_LONG,
exp->ordinal | 0x80000000); /* hint or orindal ?? */
}
else
{
fprintf (f, "\t%sID%d%s\n", ASM_RVA_BEFORE,
exp->ordinal,
ASM_RVA_AFTER);
}
}
#endif
typedef struct
{
int id;
@ -2207,466 +2173,409 @@ make_imp_label (const char *prefix, const char *name)
static bfd *
make_one_lib_file (export_type *exp, int i)
{
#if 0
{
char *name;
FILE *f;
const char *prefix = "d";
char *dest;
name = (char *) alloca (strlen (prefix) + 10);
sprintf (name, "%ss%05d.s", prefix, i);
f = fopen (name, FOPEN_WT);
fprintf (f, "\t.text\n");
fprintf (f, "\t%s\t%s%s\n", ASM_GLOBAL, ASM_PREFIX (exp->name), exp->name);
if (create_compat_implib)
fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name);
fprintf (f, "\t%s\t_imp__%s\n", ASM_GLOBAL, exp->name);
if (create_compat_implib)
fprintf (f, "%s%s:\n\t%s\t__imp_%s\n", ASM_PREFIX (exp->name),
exp->name, ASM_JUMP, exp->name);
fprintf (f, "\t.section\t.idata$7\t%s To force loading of head\n", ASM_C);
fprintf (f, "\t%s\t%s\n", ASM_LONG, head_label);
fprintf (f,"%s Import Address Table\n", ASM_C);
fprintf (f, "\t.section .idata$5\n");
if (create_compat_implib)
fprintf (f, "__imp_%s:\n", exp->name);
fprintf (f, "_imp__%s:\n", exp->name);
dump_iat (f, exp);
fprintf (f, "\n%s Import Lookup Table\n", ASM_C);
fprintf (f, "\t.section .idata$4\n");
dump_iat (f, exp);
if(!exp->noname || show_allnames)
{
fprintf (f, "%s Hint/Name table\n", ASM_C);
fprintf (f, "\t.section .idata$6\n");
fprintf (f, "ID%d:\t%s\t%d\n", exp->ordinal, ASM_SHORT, exp->hint);
fprintf (f, "\t%s\t\"%s\"\n", ASM_TEXT, xlate (exp->name));
}
fclose (f);
dest = (char *) alloca (strlen (prefix) + 10);
sprintf (dest, "%ss%05d.o", prefix, i);
assemble_file (name, dest);
}
#else /* if 0 */
{
bfd * abfd;
asymbol * exp_label;
asymbol * iname = 0;
asymbol * iname2;
asymbol * iname_lab;
asymbol ** iname_lab_pp;
asymbol ** iname_pp;
bfd * abfd;
asymbol * exp_label;
asymbol * iname = 0;
asymbol * iname2;
asymbol * iname_lab;
asymbol ** iname_lab_pp;
asymbol ** iname_pp;
#ifdef DLLTOOL_PPC
asymbol ** fn_pp;
asymbol ** toc_pp;
asymbol ** fn_pp;
asymbol ** toc_pp;
#define EXTRA 2
#endif
#ifndef EXTRA
#define EXTRA 0
#endif
asymbol * ptrs[NSECS + 4 + EXTRA + 1];
flagword applicable;
char * outname = xmalloc (strlen (TMP_STUB) + 10);
int oidx = 0;
asymbol * ptrs[NSECS + 4 + EXTRA + 1];
flagword applicable;
char * outname = xmalloc (strlen (TMP_STUB) + 10);
int oidx = 0;
sprintf (outname, "%s%05d.o", TMP_STUB, i);
sprintf (outname, "%s%05d.o", TMP_STUB, i);
abfd = bfd_openw (outname, HOW_BFD_WRITE_TARGET);
abfd = bfd_openw (outname, HOW_BFD_WRITE_TARGET);
if (!abfd)
/* xgettext:c-format */
fatal (_("bfd_open failed open stub file: %s"), outname);
if (!abfd)
/* xgettext:c-format */
fatal (_("bfd_open failed open stub file: %s"), outname);
/* xgettext:c-format */
inform (_("Creating stub file: %s"), outname);
/* xgettext:c-format */
inform (_("Creating stub file: %s"), outname);
bfd_set_format (abfd, bfd_object);
bfd_set_arch_mach (abfd, HOW_BFD_ARCH, 0);
bfd_set_format (abfd, bfd_object);
bfd_set_arch_mach (abfd, HOW_BFD_ARCH, 0);
#ifdef DLLTOOL_ARM
if (machine == MARM_INTERWORK || machine == MTHUMB)
bfd_set_private_flags (abfd, F_INTERWORK);
if (machine == MARM_INTERWORK || machine == MTHUMB)
bfd_set_private_flags (abfd, F_INTERWORK);
#endif
applicable = bfd_applicable_section_flags (abfd);
applicable = bfd_applicable_section_flags (abfd);
/* First make symbols for the sections. */
for (i = 0; i < NSECS; i++)
{
sinfo *si = secdata + i;
/* First make symbols for the sections. */
for (i = 0; i < NSECS; i++)
{
sinfo *si = secdata + i;
if (si->id != i)
abort();
si->sec = bfd_make_section_old_way (abfd, si->name);
bfd_set_section_flags (abfd,
si->sec,
si->flags & applicable);
if (si->id != i)
abort();
si->sec = bfd_make_section_old_way (abfd, si->name);
bfd_set_section_flags (abfd,
si->sec,
si->flags & applicable);
bfd_set_section_alignment(abfd, si->sec, si->align);
si->sec->output_section = si->sec;
si->sym = bfd_make_empty_symbol(abfd);
si->sym->name = si->sec->name;
si->sym->section = si->sec;
si->sym->flags = BSF_LOCAL;
si->sym->value = 0;
ptrs[oidx] = si->sym;
si->sympp = ptrs + oidx;
si->size = 0;
si->data = NULL;
bfd_set_section_alignment(abfd, si->sec, si->align);
si->sec->output_section = si->sec;
si->sym = bfd_make_empty_symbol(abfd);
si->sym->name = si->sec->name;
si->sym->section = si->sec;
si->sym->flags = BSF_LOCAL;
si->sym->value = 0;
ptrs[oidx] = si->sym;
si->sympp = ptrs + oidx;
si->size = 0;
si->data = NULL;
oidx++;
}
oidx++;
}
if (! exp->data)
{
exp_label = bfd_make_empty_symbol (abfd);
exp_label->name = make_imp_label ("", exp->name);
if (! exp->data)
{
exp_label = bfd_make_empty_symbol (abfd);
exp_label->name = make_imp_label ("", exp->name);
/* On PowerPC, the function name points to a descriptor in
the rdata section, the first element of which is a
pointer to the code (..function_name), and the second
points to the .toc. */
/* On PowerPC, the function name points to a descriptor in
the rdata section, the first element of which is a
pointer to the code (..function_name), and the second
points to the .toc. */
#ifdef DLLTOOL_PPC
if (machine == MPPC)
exp_label->section = secdata[RDATA].sec;
else
if (machine == MPPC)
exp_label->section = secdata[RDATA].sec;
else
#endif
exp_label->section = secdata[TEXT].sec;
exp_label->section = secdata[TEXT].sec;
exp_label->flags = BSF_GLOBAL;
exp_label->value = 0;
exp_label->flags = BSF_GLOBAL;
exp_label->value = 0;
#ifdef DLLTOOL_ARM
if (machine == MTHUMB)
bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC);
if (machine == MTHUMB)
bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC);
#endif
ptrs[oidx++] = exp_label;
}
ptrs[oidx++] = exp_label;
}
/* Generate imp symbols with one underscore for Microsoft
compatibility, and with two underscores for backward
compatibility with old versions of cygwin. */
if (create_compat_implib)
{
iname = bfd_make_empty_symbol (abfd);
iname->name = make_imp_label ("___imp", exp->name);
iname->section = secdata[IDATA5].sec;
iname->flags = BSF_GLOBAL;
iname->value = 0;
}
/* Generate imp symbols with one underscore for Microsoft
compatibility, and with two underscores for backward
compatibility with old versions of cygwin. */
if (create_compat_implib)
{
iname = bfd_make_empty_symbol (abfd);
iname->name = make_imp_label ("___imp", exp->name);
iname->section = secdata[IDATA5].sec;
iname->flags = BSF_GLOBAL;
iname->value = 0;
}
iname2 = bfd_make_empty_symbol (abfd);
iname2->name = make_imp_label ("__imp_", exp->name);
iname2->section = secdata[IDATA5].sec;
iname2->flags = BSF_GLOBAL;
iname2->value = 0;
iname2 = bfd_make_empty_symbol (abfd);
iname2->name = make_imp_label ("__imp_", exp->name);
iname2->section = secdata[IDATA5].sec;
iname2->flags = BSF_GLOBAL;
iname2->value = 0;
iname_lab = bfd_make_empty_symbol (abfd);
iname_lab = bfd_make_empty_symbol (abfd);
iname_lab->name = head_label;
iname_lab->section = (asection *) &bfd_und_section;
iname_lab->flags = 0;
iname_lab->value = 0;
iname_lab->name = head_label;
iname_lab->section = (asection *) &bfd_und_section;
iname_lab->flags = 0;
iname_lab->value = 0;
iname_pp = ptrs + oidx;
if (create_compat_implib)
ptrs[oidx++] = iname;
ptrs[oidx++] = iname2;
iname_pp = ptrs + oidx;
if (create_compat_implib)
ptrs[oidx++] = iname;
ptrs[oidx++] = iname2;
iname_lab_pp = ptrs + oidx;
ptrs[oidx++] = iname_lab;
iname_lab_pp = ptrs + oidx;
ptrs[oidx++] = iname_lab;
#ifdef DLLTOOL_PPC
/* The symbol referring to the code (.text). */
{
asymbol *function_name;
/* The symbol referring to the code (.text). */
{
asymbol *function_name;
function_name = bfd_make_empty_symbol(abfd);
function_name->name = make_label ("..", exp->name);
function_name->section = secdata[TEXT].sec;
function_name->flags = BSF_GLOBAL;
function_name->value = 0;
function_name = bfd_make_empty_symbol(abfd);
function_name->name = make_label ("..", exp->name);
function_name->section = secdata[TEXT].sec;
function_name->flags = BSF_GLOBAL;
function_name->value = 0;
fn_pp = ptrs + oidx;
ptrs[oidx++] = function_name;
}
fn_pp = ptrs + oidx;
ptrs[oidx++] = function_name;
}
/* The .toc symbol. */
{
asymbol *toc_symbol;
/* The .toc symbol. */
{
asymbol *toc_symbol;
toc_symbol = bfd_make_empty_symbol (abfd);
toc_symbol->name = make_label (".", "toc");
toc_symbol->section = (asection *)&bfd_und_section;
toc_symbol->flags = BSF_GLOBAL;
toc_symbol->value = 0;
toc_symbol = bfd_make_empty_symbol (abfd);
toc_symbol->name = make_label (".", "toc");
toc_symbol->section = (asection *)&bfd_und_section;
toc_symbol->flags = BSF_GLOBAL;
toc_symbol->value = 0;
toc_pp = ptrs + oidx;
ptrs[oidx++] = toc_symbol;
}
toc_pp = ptrs + oidx;
ptrs[oidx++] = toc_symbol;
}
#endif
ptrs[oidx] = 0;
ptrs[oidx] = 0;
for (i = 0; i < NSECS; i++)
for (i = 0; i < NSECS; i++)
{
sinfo *si = secdata + i;
asection *sec = si->sec;
arelent *rel;
arelent **rpp;
switch (i)
{
sinfo *si = secdata + i;
asection *sec = si->sec;
arelent *rel;
arelent **rpp;
switch (i)
case TEXT:
if (! exp->data)
{
case TEXT:
if (! exp->data)
si->size = HOW_JTAB_SIZE;
si->data = xmalloc (HOW_JTAB_SIZE);
memcpy (si->data, HOW_JTAB, HOW_JTAB_SIZE);
/* add the reloc into idata$5 */
rel = xmalloc (sizeof (arelent));
rpp = xmalloc (sizeof (arelent *) * 2);
rpp[0] = rel;
rpp[1] = 0;
rel->address = HOW_JTAB_ROFF;
rel->addend = 0;
if (machine == MPPC)
{
si->size = HOW_JTAB_SIZE;
si->data = xmalloc (HOW_JTAB_SIZE);
memcpy (si->data, HOW_JTAB, HOW_JTAB_SIZE);
/* add the reloc into idata$5 */
rel = xmalloc (sizeof (arelent));
rpp = xmalloc (sizeof (arelent *) * 2);
rpp[0] = rel;
rpp[1] = 0;
rel->address = HOW_JTAB_ROFF;
rel->addend = 0;
if (machine == MPPC)
{
rel->howto = bfd_reloc_type_lookup (abfd,
BFD_RELOC_16_GOTOFF);
rel->sym_ptr_ptr = iname_pp;
}
else
{
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
rel->sym_ptr_ptr = secdata[IDATA5].sympp;
}
sec->orelocation = rpp;
sec->reloc_count = 1;
}
break;
case IDATA4:
case IDATA5:
/* An idata$4 or idata$5 is one word long, and has an
rva to idata$6. */
si->data = xmalloc (4);
si->size = 4;
if (exp->noname)
{
si->data[0] = exp->ordinal ;
si->data[1] = exp->ordinal >> 8;
si->data[2] = exp->ordinal >> 16;
si->data[3] = 0x80;
rel->howto = bfd_reloc_type_lookup (abfd,
BFD_RELOC_16_GOTOFF);
rel->sym_ptr_ptr = iname_pp;
}
else
{
sec->reloc_count = 1;
memset (si->data, 0, si->size);
rel = xmalloc (sizeof (arelent));
rpp = xmalloc (sizeof (arelent *) * 2);
rpp[0] = rel;
rpp[1] = 0;
rel->address = 0;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_RVA);
rel->sym_ptr_ptr = secdata[IDATA6].sympp;
sec->orelocation = rpp;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
rel->sym_ptr_ptr = secdata[IDATA5].sympp;
}
sec->orelocation = rpp;
sec->reloc_count = 1;
}
break;
case IDATA4:
case IDATA5:
/* An idata$4 or idata$5 is one word long, and has an
rva to idata$6. */
break;
si->data = xmalloc (4);
si->size = 4;
case IDATA6:
if (!exp->noname)
{
/* This used to add 1 to exp->hint. I don't know
why it did that, and it does not match what I see
in programs compiled with the MS tools. */
int idx = exp->hint;
si->size = strlen (xlate (exp->import_name)) + 3;
si->data = xmalloc (si->size);
si->data[0] = idx & 0xff;
si->data[1] = idx >> 8;
strcpy (si->data + 2, xlate (exp->import_name));
}
break;
case IDATA7:
si->size = 4;
si->data = xmalloc (4);
if (exp->noname)
{
si->data[0] = exp->ordinal ;
si->data[1] = exp->ordinal >> 8;
si->data[2] = exp->ordinal >> 16;
si->data[3] = 0x80;
}
else
{
sec->reloc_count = 1;
memset (si->data, 0, si->size);
rel = xmalloc (sizeof (arelent));
rpp = xmalloc (sizeof (arelent *) * 2);
rpp[0] = rel;
rpp[1] = 0;
rel->address = 0;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_RVA);
rel->sym_ptr_ptr = iname_lab_pp;
rel->sym_ptr_ptr = secdata[IDATA6].sympp;
sec->orelocation = rpp;
sec->reloc_count = 1;
break;
}
break;
case IDATA6:
if (!exp->noname)
{
/* This used to add 1 to exp->hint. I don't know
why it did that, and it does not match what I see
in programs compiled with the MS tools. */
int idx = exp->hint;
si->size = strlen (xlate (exp->import_name)) + 3;
si->data = xmalloc (si->size);
si->data[0] = idx & 0xff;
si->data[1] = idx >> 8;
strcpy (si->data + 2, xlate (exp->import_name));
}
break;
case IDATA7:
si->size = 4;
si->data = xmalloc (4);
memset (si->data, 0, si->size);
rel = xmalloc (sizeof (arelent));
rpp = xmalloc (sizeof (arelent *) * 2);
rpp[0] = rel;
rel->address = 0;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_RVA);
rel->sym_ptr_ptr = iname_lab_pp;
sec->orelocation = rpp;
sec->reloc_count = 1;
break;
#ifdef DLLTOOL_PPC
case PDATA:
{
/* The .pdata section is 5 words long.
Think of it as:
struct
{
bfd_vma BeginAddress, [0x00]
EndAddress, [0x04]
ExceptionHandler, [0x08]
HandlerData, [0x0c]
PrologEndAddress; [0x10]
}; */
/* So this pdata section setups up this as a glue linkage to
a dll routine. There are a number of house keeping things
we need to do:
1. In the name of glue trickery, the ADDR32 relocs for 0,
4, and 0x10 are set to point to the same place:
"..function_name".
2. There is one more reloc needed in the pdata section.
The actual glue instruction to restore the toc on
return is saved as the offset in an IMGLUE reloc.
So we need a total of four relocs for this section.
3. Lastly, the HandlerData field is set to 0x03, to indicate
that this is a glue routine. */
arelent *imglue, *ba_rel, *ea_rel, *pea_rel;
/* Alignment must be set to 2**2 or you get extra stuff. */
bfd_set_section_alignment(abfd, sec, 2);
si->size = 4 * 5;
si->data = xmalloc (si->size);
memset (si->data, 0, si->size);
rpp = xmalloc (sizeof (arelent *) * 5);
rpp[0] = imglue = xmalloc (sizeof (arelent));
rpp[1] = ba_rel = xmalloc (sizeof (arelent));
rpp[2] = ea_rel = xmalloc (sizeof (arelent));
rpp[3] = pea_rel = xmalloc (sizeof (arelent));
rpp[4] = 0;
/* Stick the toc reload instruction in the glue reloc. */
bfd_put_32(abfd, ppc_glue_insn, (char *) &imglue->address);
imglue->addend = 0;
imglue->howto = bfd_reloc_type_lookup (abfd,
BFD_RELOC_32_GOTOFF);
imglue->sym_ptr_ptr = fn_pp;
ba_rel->address = 0;
ba_rel->addend = 0;
ba_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
ba_rel->sym_ptr_ptr = fn_pp;
bfd_put_32 (abfd, 0x18, si->data + 0x04);
ea_rel->address = 4;
ea_rel->addend = 0;
ea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
ea_rel->sym_ptr_ptr = fn_pp;
/* Mark it as glue. */
bfd_put_32 (abfd, 0x03, si->data + 0x0c);
/* Mark the prolog end address. */
bfd_put_32 (abfd, 0x0D, si->data + 0x10);
pea_rel->address = 0x10;
pea_rel->addend = 0;
pea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
pea_rel->sym_ptr_ptr = fn_pp;
sec->orelocation = rpp;
sec->reloc_count = 4;
break;
}
case RDATA:
/* Each external function in a PowerPC PE file has a two word
descriptor consisting of:
1. The address of the code.
2. The address of the appropriate .toc
We use relocs to build this. */
si->size = 8;
si->data = xmalloc (8);
memset (si->data, 0, si->size);
rpp = xmalloc (sizeof (arelent *) * 3);
rpp[0] = rel = xmalloc (sizeof (arelent));
rpp[1] = xmalloc (sizeof (arelent));
rpp[2] = 0;
rel->address = 0;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
rel->sym_ptr_ptr = fn_pp;
rel = rpp[1];
rel->address = 4;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
rel->sym_ptr_ptr = toc_pp;
sec->orelocation = rpp;
sec->reloc_count = 2;
break;
#endif /* DLLTOOL_PPC */
}
}
{
bfd_vma vma = 0;
/* Size up all the sections. */
for (i = 0; i < NSECS; i++)
case PDATA:
{
sinfo *si = secdata + i;
/* The .pdata section is 5 words long.
Think of it as:
struct
{
bfd_vma BeginAddress, [0x00]
EndAddress, [0x04]
ExceptionHandler, [0x08]
HandlerData, [0x0c]
PrologEndAddress; [0x10]
}; */
bfd_set_section_size (abfd, si->sec, si->size);
bfd_set_section_vma (abfd, si->sec, vma);
/* So this pdata section setups up this as a glue linkage to
a dll routine. There are a number of house keeping things
we need to do:
/* vma += si->size;*/
1. In the name of glue trickery, the ADDR32 relocs for 0,
4, and 0x10 are set to point to the same place:
"..function_name".
2. There is one more reloc needed in the pdata section.
The actual glue instruction to restore the toc on
return is saved as the offset in an IMGLUE reloc.
So we need a total of four relocs for this section.
3. Lastly, the HandlerData field is set to 0x03, to indicate
that this is a glue routine. */
arelent *imglue, *ba_rel, *ea_rel, *pea_rel;
/* Alignment must be set to 2**2 or you get extra stuff. */
bfd_set_section_alignment(abfd, sec, 2);
si->size = 4 * 5;
si->data = xmalloc (si->size);
memset (si->data, 0, si->size);
rpp = xmalloc (sizeof (arelent *) * 5);
rpp[0] = imglue = xmalloc (sizeof (arelent));
rpp[1] = ba_rel = xmalloc (sizeof (arelent));
rpp[2] = ea_rel = xmalloc (sizeof (arelent));
rpp[3] = pea_rel = xmalloc (sizeof (arelent));
rpp[4] = 0;
/* Stick the toc reload instruction in the glue reloc. */
bfd_put_32(abfd, ppc_glue_insn, (char *) &imglue->address);
imglue->addend = 0;
imglue->howto = bfd_reloc_type_lookup (abfd,
BFD_RELOC_32_GOTOFF);
imglue->sym_ptr_ptr = fn_pp;
ba_rel->address = 0;
ba_rel->addend = 0;
ba_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
ba_rel->sym_ptr_ptr = fn_pp;
bfd_put_32 (abfd, 0x18, si->data + 0x04);
ea_rel->address = 4;
ea_rel->addend = 0;
ea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
ea_rel->sym_ptr_ptr = fn_pp;
/* Mark it as glue. */
bfd_put_32 (abfd, 0x03, si->data + 0x0c);
/* Mark the prolog end address. */
bfd_put_32 (abfd, 0x0D, si->data + 0x10);
pea_rel->address = 0x10;
pea_rel->addend = 0;
pea_rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
pea_rel->sym_ptr_ptr = fn_pp;
sec->orelocation = rpp;
sec->reloc_count = 4;
break;
}
}
/* Write them out. */
for (i = 0; i < NSECS; i++)
{
sinfo *si = secdata + i;
case RDATA:
/* Each external function in a PowerPC PE file has a two word
descriptor consisting of:
1. The address of the code.
2. The address of the appropriate .toc
We use relocs to build this. */
si->size = 8;
si->data = xmalloc (8);
memset (si->data, 0, si->size);
if (i == IDATA5 && no_idata5)
continue;
rpp = xmalloc (sizeof (arelent *) * 3);
rpp[0] = rel = xmalloc (sizeof (arelent));
rpp[1] = xmalloc (sizeof (arelent));
rpp[2] = 0;
if (i == IDATA4 && no_idata4)
continue;
rel->address = 0;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
rel->sym_ptr_ptr = fn_pp;
bfd_set_section_contents (abfd, si->sec,
si->data, 0,
si->size);
rel = rpp[1];
rel->address = 4;
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (abfd, BFD_RELOC_32);
rel->sym_ptr_ptr = toc_pp;
sec->orelocation = rpp;
sec->reloc_count = 2;
break;
#endif /* DLLTOOL_PPC */
}
bfd_set_symtab (abfd, ptrs, oidx);
bfd_close (abfd);
abfd = bfd_openr (outname, HOW_BFD_READ_TARGET);
return abfd;
}
#endif
{
bfd_vma vma = 0;
/* Size up all the sections. */
for (i = 0; i < NSECS; i++)
{
sinfo *si = secdata + i;
bfd_set_section_size (abfd, si->sec, si->size);
bfd_set_section_vma (abfd, si->sec, vma);
}
}
/* Write them out. */
for (i = 0; i < NSECS; i++)
{
sinfo *si = secdata + i;
if (i == IDATA5 && no_idata5)
continue;
if (i == IDATA4 && no_idata4)
continue;
bfd_set_section_contents (abfd, si->sec,
si->data, 0,
si->size);
}
bfd_set_symtab (abfd, ptrs, oidx);
bfd_close (abfd);
abfd = bfd_openr (outname, HOW_BFD_READ_TARGET);
return abfd;
}
static bfd *