@@ -342,6 +342,54 @@ const char *GetEnv(const char *name) { return getenv(name); }
342342
343343tid_t GetTid () { return thread_self (); }
344344
345+ uptr ReadBinaryName (char *buf, uptr buf_len) {
346+ struct stat statData;
347+ struct psinfo psinfoData;
348+
349+ char FilePsinfo[100 ] = {};
350+ internal_snprintf (FilePsinfo, 100 , " /proc/%d/psinfo" , internal_getpid ());
351+ CHECK_EQ (internal_stat (FilePsinfo, &statData), 0 );
352+
353+ const int fd = internal_open (FilePsinfo, O_RDONLY);
354+ ssize_t readNum = internal_read (fd, &psinfoData, sizeof (psinfoData));
355+ CHECK_GE (readNum, 0 );
356+
357+ internal_close (fd);
358+ char *binary_name = (reinterpret_cast <char ***>(psinfoData.pr_argv ))[0 ][0 ];
359+
360+ // This is an absulate path.
361+ if (binary_name[0 ] == ' /' )
362+ return internal_snprintf (buf, buf_len, " %s" , binary_name);
363+
364+ // This is a relative path to the binary, starts with ./ or ../
365+ if (binary_name[0 ] == ' .' ) {
366+ char *path = nullptr ;
367+ if ((path = internal_getcwd (buf, buf_len)) != nullptr )
368+ return internal_snprintf (buf + internal_strlen (path),
369+ buf_len - internal_strlen (path), " /%s" ,
370+ binary_name) +
371+ internal_strlen (path);
372+ }
373+
374+ // This is running a raw binary in the dir where it is from.
375+ char *path = nullptr ;
376+ if ((path = internal_getcwd (buf, buf_len)) != nullptr ) {
377+ char fullName[kMaxPathLength ] = {};
378+ internal_snprintf (fullName, kMaxPathLength , " %s/%s" , path, binary_name);
379+ if (FileExists (fullName))
380+ return internal_snprintf (buf + internal_strlen (path),
381+ buf_len - internal_strlen (path), " /%s" ,
382+ binary_name) +
383+ internal_strlen (path);
384+ }
385+
386+ // Find the binary in the env PATH.
387+ if ((path = FindPathToBinary (binary_name)) != nullptr )
388+ return internal_snprintf (buf, buf_len, " %s" , path);
389+
390+ return 0 ;
391+ }
392+
345393// https://www.ibm.com/docs/en/aix/7.3?topic=concepts-system-memory-allocation-using-malloc-subsystem
346394uptr GetMaxVirtualAddress () {
347395# if SANITIZER_WORDSIZE == 64
@@ -353,6 +401,10 @@ uptr GetMaxVirtualAddress() {
353401
354402uptr GetMaxUserVirtualAddress () { return GetMaxVirtualAddress (); }
355403
404+ uptr ReadLongProcessName (/* out*/ char *buf, uptr buf_len) {
405+ return ReadBinaryName (buf, buf_len);
406+ }
407+
356408void InitializePlatformCommonFlags (CommonFlags *cf) {}
357409
358410void InitializePlatformEarly () {
0 commit comments