• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/contrib/elftoolchain/elfcopy/

Lines Matching refs:ecp

51 static void ac_read_objs(struct elfcopy *ecp, int ifd);
52 static void ac_write_cleanup(struct elfcopy *ecp);
54 static void ac_write_objs(struct elfcopy *ecp, int ofd);
57 static void add_to_ar_sym_table(struct elfcopy *ecp, const char *name);
58 static void extract_arsym(struct elfcopy *ecp);
59 static void process_ar_obj(struct elfcopy *ecp, struct ar_obj *obj);
60 static void sync_ar(struct elfcopy *ecp);
64 process_ar_obj(struct elfcopy *ecp, struct ar_obj *obj)
72 if ((ecp->eout = elf_begin(fd, ELF_C_WRITE, NULL)) == NULL)
75 elf_flagelf(ecp->eout, ELF_C_SET, ELF_F_LAYOUT);
76 create_elf(ecp);
77 elf_end(ecp->ein);
78 elf_end(ecp->eout);
85 if ((ecp->eout = elf_begin(fd, ELF_C_READ, NULL)) == NULL)
88 extract_arsym(ecp);
89 elf_end(ecp->eout);
106 add_to_ar_str_table(ecp, obj->name);
107 ecp->rela_off += _ARHDR_LEN + obj->size + obj->size % 2;
108 STAILQ_INSERT_TAIL(&ecp->v_arobj, obj, objs);
115 add_to_ar_str_table(struct elfcopy *ecp, const char *name)
118 if (ecp->as == NULL) {
119 ecp->as_cap = _INIT_AS_CAP;
120 ecp->as_sz = 0;
121 if ((ecp->as = malloc(ecp->as_cap)) == NULL)
129 while (ecp->as_sz + strlen(name) + 3 > ecp->as_cap) {
130 ecp->as_cap *= 2;
131 ecp->as = realloc(ecp->as, ecp->as_cap);
132 if (ecp->as == NULL)
135 strncpy(&ecp->as[ecp->as_sz], name, strlen(name));
136 ecp->as_sz += strlen(name);
137 ecp->as[ecp->as_sz++] = '/';
138 ecp->as[ecp->as_sz++] = '\n';
145 add_to_ar_sym_table(struct elfcopy *ecp, const char *name)
148 if (ecp->s_so == NULL) {
149 if ((ecp->s_so = malloc(_INIT_SYMOFF_CAP)) == NULL)
151 ecp->s_so_cap = _INIT_SYMOFF_CAP;
152 ecp->s_cnt = 0;
155 if (ecp->s_sn == NULL) {
156 if ((ecp->s_sn = malloc(_INIT_SYMNAME_CAP)) == NULL)
158 ecp->s_sn_cap = _INIT_SYMNAME_CAP;
159 ecp->s_sn_sz = 0;
162 if (ecp->s_cnt * sizeof(uint32_t) >= ecp->s_so_cap) {
163 ecp->s_so_cap *= 2;
164 ecp->s_so = realloc(ecp->s_so, ecp->s_so_cap);
165 if (ecp->s_so == NULL)
168 ecp->s_so[ecp->s_cnt] = ecp->rela_off;
169 ecp->s_cnt++;
175 while (ecp->s_sn_sz + strlen(name) + 2 > ecp->s_sn_cap) {
176 ecp->s_sn_cap *= 2;
177 ecp->s_sn = realloc(ecp->s_sn, ecp->s_sn_cap);
178 if (ecp->s_sn == NULL)
181 strncpy(&ecp->s_sn[ecp->s_sn_sz], name, strlen(name));
182 ecp->s_sn_sz += strlen(name);
183 ecp->s_sn[ecp->s_sn_sz++] = '\0';
187 sync_ar(struct elfcopy *ecp)
198 if (ecp->s_cnt != 0 && ecp->s_sn_sz % 2 != 0)
199 ecp->s_sn[ecp->s_sn_sz++] = '\0';
206 if (ecp->as != NULL && ecp->as_sz % 2 != 0)
207 ecp->as[ecp->as_sz++] = '\n';
217 if (ecp->s_cnt != 0) {
218 s_sz = (ecp->s_cnt + 1) * sizeof(uint32_t) + ecp->s_sn_sz;
220 if (ecp->as != NULL)
221 pm_sz += _ARHDR_LEN + ecp->as_sz;
222 for (i = 0; (size_t)i < ecp->s_cnt; i++)
223 *(ecp->s_so + i) = htobe32(*(ecp->s_so + i) +
232 extract_arsym(struct elfcopy *ecp)
242 if (elf_kind(ecp->eout) != ELF_K_ELF) {
246 if (elf_getshstrndx(ecp->eout, &shstrndx) == 0) {
253 while ((scn = elf_nextscn(ecp->eout, scn)) != NULL) {
258 if ((name = elf_strptr(ecp->eout, shstrndx, shdr.sh_name)) ==
277 while ((scn = elf_nextscn(ecp->eout, scn)) != NULL) {
306 if ((name = elf_strptr(ecp->eout, tabndx,
313 add_to_ar_sym_table(ecp, name);
361 ac_create_ar(struct elfcopy *ecp, int ifd, int ofd)
364 ac_read_objs(ecp, ifd);
365 sync_ar(ecp);
366 ac_write_objs(ecp, ofd);
367 ac_write_cleanup(ecp);
371 ac_read_objs(struct elfcopy *ecp, int ifd)
381 ecp->rela_off = 0;
424 if ((ecp->ein = elf_memory(buff, size)) == NULL)
427 if (elf_kind(ecp->ein) != ELF_K_ELF)
430 process_ar_obj(ecp, obj);
438 ac_write_objs(struct elfcopy *ecp, int ofd)
457 archive_entry_set_size(entry, (ecp->s_cnt + 1) * sizeof(uint32_t) +
458 ecp->s_sn_sz);
460 nr = htobe32(ecp->s_cnt);
462 ac_write_data(a, ecp->s_so, sizeof(uint32_t) * ecp->s_cnt);
463 ac_write_data(a, ecp->s_sn, ecp->s_sn_sz);
467 if (ecp->as != NULL) {
470 archive_entry_set_size(entry, ecp->as_sz);
472 ac_write_data(a, ecp->as, ecp->as_sz);
477 STAILQ_FOREACH(obj, &ecp->v_arobj, objs) {
496 ac_write_cleanup(struct elfcopy *ecp)
500 STAILQ_FOREACH_SAFE(obj, &ecp->v_arobj, objs, obj_temp) {
501 STAILQ_REMOVE(&ecp->v_arobj, obj, ar_obj, objs);
508 free(ecp->as);
509 free(ecp->s_so);
510 free(ecp->s_sn);
511 ecp->as = NULL;
512 ecp->s_so = NULL;
513 ecp->s_sn = NULL;