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);
|