727                 return (NULL);
 728 
 729         if ((mptr = object_name_to_map(P, lmid, name)) == NULL)
 730                 return (NULL);
 731 
 732         /*
 733          * By building the symbol table, we implicitly bring the PLT
 734          * information up to date in the load object.
 735          */
 736         (void) build_map_symtab(P, mptr);
 737 
 738         return (mptr->map_file->file_lo);
 739 }
 740 
 741 const rd_loadobj_t *
 742 Pname_to_loadobj(struct ps_prochandle *P, const char *name)
 743 {
 744         return (Plmid_to_loadobj(P, PR_LMID_EVERY, name));
 745 }
 746 
 747 /*
 748  * We've been given a file_info_t which doesn't have any CTF. However, it may
 749  * have information that's in a format that we could convert if on the fly.
 750  * We'll first try to convert the alternate debug file, if present, and then
 751  * move onto the default file. The reason we prefer the alternate debug file is
 752  * that if both exist, then it likely has any usable debugging information.
 753  */
 754 static ctf_file_t *
 755 Pconvert_file_ctf(file_info_t *fptr)
 756 {
 757         int err;
 758         ctf_file_t *fp;
 759         char errmsg[1024];
 760 
 761         /*
 762          * Provide an opt in.
 763          */
 764         if (getenv("LIBPROC_CTFCONVERT") == NULL)
 765                 return (NULL);
 766 
 767         /*
 768          * If we've already attempted to call this, then that's it. No reason to
 769          * pretend we'll be more successful again another time.
 770          */
 771         if (fptr->file_cvt == B_TRUE)
 772                 return (NULL);
 773         fptr->file_cvt = B_TRUE;
 774 
 775         fp = NULL;
 776         if (fptr->file_dbgelf != NULL) {
 777                 fp = ctf_elfconvert(fptr->file_fd, fptr->file_dbgelf, NULL, 1,
 778                     0, &err, errmsg, sizeof (errmsg));
 779                 if (fp == NULL) {
 780                         dprintf("failed to convert %s: %s\n", fptr->file_pname,
 781                             err == ECTF_CONVBKERR ? errmsg : ctf_errmsg(err));
 782                 }
 783         }
 784         if (fp == NULL) {
 785                 fp = ctf_elfconvert(fptr->file_fd, fptr->file_elf, NULL, 1,
 786                     0, &err, errmsg, sizeof (errmsg));
 787                 if (fp == NULL) {
 788                         dprintf("failed to convert %s: %s\n", fptr->file_pname,
 789                             err == ECTF_CONVBKERR ? errmsg : ctf_errmsg(err));
 790                 }
 791         }
 792         if (fp != NULL) {
 793                 fptr->file_ctfp = fp;
 794         }
 795 
 796         return (NULL);
 797 }
 798 
 799 ctf_file_t *
 800 Pbuild_file_ctf(struct ps_prochandle *P, file_info_t *fptr)
 801 {
 802         ctf_sect_t ctdata, symtab, strtab;
 803         sym_tbl_t *symp;
 804         int err;
 805 
 806         if (fptr->file_ctfp != NULL)
 807                 return (fptr->file_ctfp);
 808 
 809         Pbuild_file_symtab(P, fptr);
 810 
 811         if (fptr->file_ctf_size == 0) {
 812                 return (Pconvert_file_ctf(fptr));
 813         }
 814 
 815         symp = fptr->file_ctf_dyn ? &fptr->file_dynsym : &fptr->file_symtab;
 816         if (symp->sym_data_pri == NULL)
 817                 return (NULL);
 818 
 819         /*
 820          * The buffer may alread be allocated if this is a core file that
 821          * contained CTF data for this file.
 822          */
 823         if (fptr->file_ctf_buf == NULL) {
 824                 fptr->file_ctf_buf = malloc(fptr->file_ctf_size);
 825                 if (fptr->file_ctf_buf == NULL) {
 826                         dprintf("failed to allocate ctf buffer\n");
 827                         return (NULL);
 828                 }
 829 
 830                 if (pread(fptr->file_fd, fptr->file_ctf_buf,
 831                     fptr->file_ctf_size, fptr->file_ctf_off) !=
 832                     fptr->file_ctf_size) {
 833                         free(fptr->file_ctf_buf);
 
 | 
 
 
 727                 return (NULL);
 728 
 729         if ((mptr = object_name_to_map(P, lmid, name)) == NULL)
 730                 return (NULL);
 731 
 732         /*
 733          * By building the symbol table, we implicitly bring the PLT
 734          * information up to date in the load object.
 735          */
 736         (void) build_map_symtab(P, mptr);
 737 
 738         return (mptr->map_file->file_lo);
 739 }
 740 
 741 const rd_loadobj_t *
 742 Pname_to_loadobj(struct ps_prochandle *P, const char *name)
 743 {
 744         return (Plmid_to_loadobj(P, PR_LMID_EVERY, name));
 745 }
 746 
 747 ctf_file_t *
 748 Pbuild_file_ctf(struct ps_prochandle *P, file_info_t *fptr)
 749 {
 750         ctf_sect_t ctdata, symtab, strtab;
 751         sym_tbl_t *symp;
 752         int err;
 753 
 754         if (fptr->file_ctfp != NULL)
 755                 return (fptr->file_ctfp);
 756 
 757         Pbuild_file_symtab(P, fptr);
 758 
 759         if (fptr->file_ctf_size == 0)
 760                 return (NULL);
 761 
 762         symp = fptr->file_ctf_dyn ? &fptr->file_dynsym : &fptr->file_symtab;
 763         if (symp->sym_data_pri == NULL)
 764                 return (NULL);
 765 
 766         /*
 767          * The buffer may alread be allocated if this is a core file that
 768          * contained CTF data for this file.
 769          */
 770         if (fptr->file_ctf_buf == NULL) {
 771                 fptr->file_ctf_buf = malloc(fptr->file_ctf_size);
 772                 if (fptr->file_ctf_buf == NULL) {
 773                         dprintf("failed to allocate ctf buffer\n");
 774                         return (NULL);
 775                 }
 776 
 777                 if (pread(fptr->file_fd, fptr->file_ctf_buf,
 778                     fptr->file_ctf_size, fptr->file_ctf_off) !=
 779                     fptr->file_ctf_size) {
 780                         free(fptr->file_ctf_buf);
 
 |