Hi Paul

Have you tried mdb? We have our own debug data format called CTF and depending on how you compiled your file the DWARF data may be stripped from the binary.

If you want a stacktrace from mdb you can type ::stack

For more detailed usage of mdb check the manpage or ask on #illumos IRC or any illumos mailinglist. There are not many illumos devs here on this list and I have never used gdb. Only ever mdb.

Greetings
Till


On 14.07.25 11:39, Paul Floyd via oi-dev wrote:
Hi

I'm working on an issue related to an exe opening its own binary file with flags like O_WRONLY|O_CREAT|O_TRUNC. Any writing is going to be bad, and truncation even worse.

On FreeBSD and Linux this is not allowed. 'open' will fail and set errno to ETXTBSY.

I haven't yet tried this on Solaris.  My testcase just opens and truncates the exe and core dumps on the first call to open.

Under gdb I get

Dwarf Error: wrong version in compilation unit header (is 0, should be 2, 3, 4 or 5) [in module /export/home/paulf/scratch/valgrind/memcheck/ tests/solaris/open_client]

I guess that;s because it's failing to rread the Dwarf from the 0 byte file.

Here is my testcase, works fine on FreeBSD

// For Bug 505673
// Valgrind crashes with an internal error and SIGBUS when the guest tries to open its own file with O_WRONLY|O_CREAT|O_TRUNC
#include <fcntl.h>
#include <cerrno>
#include <stdexcept>
#include <vector>
#include <unistd.h>
#include <sys/syscall.h>
#include <unistd.h>

int main(int argc, char** argv)
{
     std::vector<int> flags{O_WRONLY|O_CREAT|O_TRUNC, O_WRONLY, O_RDWR};

     // On FreeBSD libc open uses syscall openat (at least on 14.2)
     for (auto f : flags)
     {
         int res = open(argv[0], f, 0666);
         if (-1 != res)
         {
             throw std::runtime_error("open should have failed");
         }
         else
         {
             if (errno != ETXTBSY)
             {
                 throw std::runtime_error("errno should be ETXTBSY");
             }
         }
     }

     // repeat the above, but with syscall(SYS_OPEN
     for (auto f : flags)
     {
         int res = syscall(SYS_open, argv[0], f, 0666);
         if (-1 != res)
         {
             throw std::runtime_error("open should have failed");
         }
         else
         {
             if (errno != ETXTBSY)
             {
                 throw std::runtime_error("errno should be ETXTBSY");
             }
         }
     }

     chdir("..");

     // check that relative paths work
     for (auto f : flags)
     {
         int res = open("solaris/open_client", f, 0666);
         if (-1 != res)
         {
             throw std::runtime_error("open should have failed");
         }
         else
         {
             if (errno != ETXTBSY)
             {
                 throw std::runtime_error("errno should be ETXTBSY");
             }
         }
     }

     for (auto f : flags)
     {
         int res = syscall(SYS_open, "solaris/open_client", f, 0666);
         if (-1 != res)
         {
             throw std::runtime_error("open should have failed");
         }
         else
         {
             if (errno != ETXTBSY)
             {
                 throw std::runtime_error("errno should be ETXTBSY");
             }
         }
     }
}

A+

Paul



_______________________________________________
oi-dev mailing list
oi-dev@openindiana.org
https://openindiana.org/mailman/listinfo/oi-dev

_______________________________________________
oi-dev mailing list
oi-dev@openindiana.org
https://openindiana.org/mailman/listinfo/oi-dev

Reply via email to