hdr->sh_size = sec->size;
}
- sframe_encoder_free (&sfe_ctx);
+ sframe_encoder_free (&sfe_info->sfe_ctx);
return retval;
}
return entry;
}
+static void
+elf_s390_link_hash_table_free (bfd *obfd)
+{
+ struct elf_s390_link_hash_table *htab
+ = (struct elf_s390_link_hash_table *) obfd->link.hash;
+ sframe_encoder_free (&htab->plt_cfe_ctx);
+ _bfd_elf_link_hash_table_free (obfd);
+}
+
/* Create an s390 ELF linker hash table. */
static struct bfd_link_hash_table *
elf_s390_link_hash_table_create (bfd *abfd)
{
struct elf_s390_link_hash_table *ret;
- size_t amt = sizeof (struct elf_s390_link_hash_table);
- ret = (struct elf_s390_link_hash_table *) bfd_zmalloc (amt);
+ ret = bfd_zmalloc (sizeof (*ret));
if (ret == NULL)
return NULL;
free (ret);
return NULL;
}
+ ret->elf.root.hash_table_free = elf_s390_link_hash_table_free;
return &ret->elf.root;
}
_bfd_s390_elf_write_sframe_plt (struct bfd_link_info *info)
{
struct elf_s390_link_hash_table *htab;
- sframe_encoder_ctx *ectx;
+ sframe_encoder_ctx **ectx;
size_t sec_size;
asection *sec;
bfd *dynobj;
htab = elf_s390_hash_table (info);
dynobj = htab->elf.dynobj;
- ectx = htab->plt_cfe_ctx;
+ ectx = &htab->plt_cfe_ctx;
sec = htab->plt_sframe;
- BFD_ASSERT (ectx);
+ BFD_ASSERT (*ectx);
- void *contents = sframe_encoder_write (ectx, &sec_size, false, &err);
+ void *contents = sframe_encoder_write (*ectx, &sec_size, false, &err);
sec->size = (bfd_size_type) sec_size;
sec->contents = (unsigned char *) bfd_zalloc (dynobj, sec->size);
sec->alloced = 1;
memcpy (sec->contents, contents, sec_size);
- sframe_encoder_free (&ectx);
+ sframe_encoder_free (ectx);
return true;
}
#include "libbfd.h"
#define ARCH_SIZE 0
#include "elf-bfd.h"
+#include "sframe-api.h"
#include "safe-ctype.h"
#include "libiberty.h"
#include "objalloc.h"
free (htab->eh_info.u.compact.entries);
else
free (htab->eh_info.u.dwarf.array);
+ sframe_encoder_free (&htab->sfe_info.sfe_ctx);
_bfd_generic_link_hash_table_free (obfd);
}
htab_delete (htab->loc_hash_table);
if (htab->loc_hash_memory)
objalloc_free ((struct objalloc *) htab->loc_hash_memory);
+ sframe_encoder_free (&htab->plt_cfe_ctx);
+ sframe_encoder_free (&htab->plt_second_cfe_ctx);
+ sframe_encoder_free (&htab->plt_got_cfe_ctx);
_bfd_elf_link_hash_table_free (obfd);
}
{
struct elf_x86_link_hash_table *htab;
elf_backend_data *bed;
- sframe_encoder_ctx *ectx;
+ sframe_encoder_ctx **ectx;
size_t sec_size;
asection *sec;
bfd *dynobj;
switch (plt_sec_type)
{
case SFRAME_PLT:
- ectx = htab->plt_cfe_ctx;
+ ectx = &htab->plt_cfe_ctx;
sec = htab->plt_sframe;
break;
case SFRAME_PLT_SEC:
- ectx = htab->plt_second_cfe_ctx;
+ ectx = &htab->plt_second_cfe_ctx;
sec = htab->plt_second_sframe;
break;
case SFRAME_PLT_GOT:
- ectx = htab->plt_got_cfe_ctx;
+ ectx = &htab->plt_got_cfe_ctx;
sec = htab->plt_got_sframe;
break;
default:
break;
}
- BFD_ASSERT (ectx);
+ BFD_ASSERT (*ectx);
- void *contents = sframe_encoder_write (ectx, &sec_size, false, &err);
+ void *contents = sframe_encoder_write (*ectx, &sec_size, false, &err);
sec->size = (bfd_size_type) sec_size;
sec->contents = (unsigned char *) bfd_zalloc (dynobj, sec->size);
sec->alloced = 1;
memcpy (sec->contents, contents, sec_size);
- sframe_encoder_free (&ectx);
+ sframe_encoder_free (ectx);
return true;
}
sframe_encoder_write_sframe assume flag SFRAME_F_FDE_FUNC_START_PCREL
set. */
if (!(flags & SFRAME_F_FDE_FUNC_START_PCREL))
- return sframe_ret_set_errno (errp, SFRAME_ERR_ECTX_INVAL);
+ {
+ free (ectx);
+ return sframe_ret_set_errno (errp, SFRAME_ERR_ECTX_INVAL);
+ }
hp->sfh_abi_arch = abi_arch;
hp->sfh_cfa_fixed_fp_offset = fixed_fp_offset;