@@ -102,68 +102,24 @@ bool MemoryMappingLayout::Next(MemoryMappedSegment *segment) {
102102 segment->protection |= kProtectionShared ;
103103
104104 if (segment->filename && mapIter->pr_pathoff ) {
105- if (type == MA_MAINDATA || type == MA_MAINEXEC) {
106- // AIX procmap does not print full name for the binary, however when using
107- // llvm-symbolizer, it requires the binary must be with full name.
108- const char *BinaryName = GetBinaryName ();
109- uptr len =
110- Min ((uptr)(internal_strlen (BinaryName)), segment->filename_size - 1 );
111- internal_strncpy (segment->filename , BinaryName, len);
112- segment->filename [len] = 0 ;
113- } else {
114- // AIX library may exist as xxx.a[yyy.o], to find the path to xxx.a,
115- // the [yyy.o] part needs to be removed.
116-
117- // TODO FIXME
118- const char *pathPtr = data_.proc_self_maps .data + mapIter->pr_pathoff ;
119- uptr len = Min ((uptr)internal_strlen (pathPtr),
120- segment->filename_size - 1 );
121- internal_strncpy (segment->filename , pathPtr, len);
122- segment->filename [len] = 0 ;
123- // AIX procmap does not print full name for user's library , however when
124- // use llvm-symbolizer, it requires the library must be with full name.
125- if ((type == MA_SLIBTEXT || type == MA_PLIBDATA) &&
126- segment->filename [0 ] != ' /' ) {
127- // First check if the library is in the directory where the binary is
128- // executed. On AIX, there is no need to put library in same dir with
129- // the binary to path search envs.
130- char *path = nullptr ;
131- char buf[kMaxPathLength ];
132- unsigned buf_len = kMaxPathLength ;
133- bool found = false ;
134- if ((path = internal_getcwd (buf, buf_len)) != nullptr ) {
135- // if the path is too long, don't do other search either.
136- if (internal_strlen (path) > segment->filename_size - 1 )
137- found = true ;
138- else {
139- internal_snprintf (
140- buf + internal_strlen (path),
141- segment->filename_size - 1 - internal_strlen (path), " /%s" ,
142- segment->filename );
143- if (FileExists (buf)) {
144- uptr len =
145- Min ((uptr)(internal_strlen (buf)), segment->filename_size - 1 );
146- internal_strncpy (segment->filename , buf, len);
147- segment->filename [len] = 0 ;
148- found = true ;
149- }
150- }
151- }
152- if (!found) {
153- const char *LibName =
154- FindPathToBinaryOrLibrary (segment->filename , " LIBPATH" );
155- CHECK (LibName);
156- uptr len =
157- Min ((uptr)(internal_strlen (LibName)), segment->filename_size - 1 );
158- internal_strncpy (segment->filename , LibName, len);
159- segment->filename [len] = 0 ;
160- found = true ;
161- }
162- CHECK (found);
163- }
164- }
105+ uptr len;
106+ constexpr unsigned BUFFER_SIZE = 128 ;
107+ char objPath[BUFFER_SIZE] = {};
108+ // Use path /proc/<pid>/object/<object_id> to pass to the symbolizer.
109+ internal_snprintf (objPath, BUFFER_SIZE, " /proc/%d/object/%s" , internal_getpid (), mapIter->pr_mapname );
110+ len = Min ((uptr)internal_strlen (objPath), segment->filename_size - 1 );
111+ internal_strncpy (segment->filename , objPath, len);
112+ segment->filename [len] = 0 ;
113+
114+ // We don't have the full path to user libraries, so we use what we have available as the
115+ // display name.
116+ const char *displayPath = data_.proc_self_maps .data + mapIter->pr_pathoff ;
117+ len = Min ((uptr)internal_strlen (displayPath), segment->displayname_size - 1 );
118+ internal_strncpy (segment->displayname , displayPath, len);
119+ segment->displayname [len] = 0 ;
165120 } else if (segment->filename ) {
166121 segment->filename [0 ] = 0 ;
122+ segment->displayname [0 ] = 0 ;
167123 }
168124
169125 assert (mapIter->pr_off == 0 && " expect a zero offset into module." );
0 commit comments