blob: 330756e7d2ec01d61e1a3ecba0f7e7050919fb1e [file] [log] [blame]
sewardj8eb8bab2015-07-21 14:44:28 +00001Requirements
2------------
3- You need a recent Solaris-like OS to compile this port. Solaris 11 or
4 any illumos-based distribution should work, Solaris 10 is not supported.
5 Running `uname -r` has to print '5.11'.
6- Recent GCC tools are required, GCC 3 will probably not work. GCC version
7 4.5 (or higher) is recommended.
8- Solaris ld has to be the first linker in the PATH. GNU ld cannot be used.
9 There is currently no linker check in the configure script but the linking
10 phase fails if GNU ld is used. Recent Solaris/illumos distributions are ok.
11- A working combination of autotools is required: aclocal, autoheader,
12 automake and autoconf have to be found in the PATH. You should be able to
13 install pkg:/developer/build/automake and pkg:/developer/build/autoconf
14 packages to fullfil this requirement.
iraisraeed80f2015-10-21 12:02:04 +000015- System header files are required. On Solaris, these can be installed with:
16 # pkg install system/header
17- GNU make is also required. On Solaris, this can be quickly achieved with:
18 $ PATH=/usr/gnu/bin:$PATH; export PATH
sewardj8eb8bab2015-07-21 14:44:28 +000019- For remote debugging support, working GDB is required (see below).
20
21
22Compilation
23-----------
24Please follow the generic instructions in the README file.
25
26The configure script detects a canonical host to determine which version of
27Valgrind should be built. If the system compiler by default produces 32-bit
28binaries then only a 32-bit version of Valgrind will be built. To enable
29compilation of both 64-bit and 32-bit versions on such a system, issue the
30configure script as follows:
31./configure CC='gcc -m64' CXX='g++ -m64'
32
33
34Oracle Solaris and illumos support
35----------------------------------
36One of the main goal of this port is to support both Oracle Solaris and
37illumos kernels. This is a very hard task because Solaris kernel traditionally
38does not provide a stable syscall interface and because Valgrind contains
39several parts that are closely tied to the underlying kernel. For these
40reasons, the port needs to detect which syscall interfaces are present. This
41detection cannot be done easily at run time and is currently implemented as
42a set of configure tests. This means that a binary version of this port can be
43executed only on a kernel that is compatible with a kernel that was used
44during the configure and compilation time.
45
46Main currently-known incompatibilities:
47- Solaris 11 (released in November 2011) removed a large set of syscalls where
48 *at variant of the syscall was also present, for example, open() versus
49 openat(AT_FDCWD) [1]
50- syscall number for unlinkat() is 76 on Solaris 11, but 65 on illumos [2]
51- illumos (in April 2013) changed interface of the accept() and pipe()
52 syscalls [3]
Elliott Hughesa0664b92017-04-18 17:46:52 -070053- posix_spawn() functionality is backed up by true spawn() syscall on Solaris 12
54 whereas illumos and Solaris 11 leverage vfork()
55- illumos and older Solaris use utimesys() syscall whereas newer Solaris
56 uses utimensat()
sewardj8eb8bab2015-07-21 14:44:28 +000057
58[1] http://docs.oracle.com/cd/E26502_01/html/E28556/gkzlf.html#gkzip
59[2] https://www.illumos.org/issues/521
60[3] https://github.com/illumos/illumos-gate/commit/5dbfd19ad5fcc2b779f40f80fa05c1bd28fd0b4e
61
62
63Limitations
64-----------
65- The port is Work-In-Progress, many things may not work or they can be subtly
66 broken.
67- Coredumps produced by Valgrind do not contain all information available,
68 especially microstate accounting and processor bindings.
69- Accessing contents of /proc/self/psinfo is not thread-safe. That is because
70 Valgrind emulates this file on behalf of the client programs. Entire
71 open() - read() - close() sequence on this file needs to be performed
72 atomically.
73- Fork limitations: vfork() is translated to fork(), forkall() is not
74 supported.
75- Valgrind does not track definedness of some eflags (OF, SF, ZF, AF, CF, PF)
76 individually for each flag. After a syscall is finished, when a carry flag
77 is set and defined, all other mentioned flags will be also defined even
78 though they might be undefined before making the syscall.
79- System call "execve" with a file descriptor which points to a hardlink
80 is currently not supported. That is because from the opened file descriptor
81 itself it is not possible to reverse map the intended pathname.
82 Examples are fexecve(3C) and isaexec(3C).
iraisrfa0a7f42015-08-01 21:53:08 +000083- Program headers PT_SUNW_SYSSTAT and PT_SUNW_SYSSTAT_ZONE are not supported.
iraisr9223db92015-08-03 10:48:16 +000084 That is, programs linked with mapfile directive RESERVE_SEGMENT and attribute
iraisrfa0a7f42015-08-01 21:53:08 +000085 TYPE equal to SYSSTAT or SYSSTAT_ZONE will cause Valgrind exit. It is not
86 possible for Valgrind to arrange mapping of a kernel shared page at the
87 address specified in the mapfile for the guest application. There is currently
iraisr9223db92015-08-03 10:48:16 +000088 no such mechanism in Solaris. Hacky workarounds are possible, though.
sewardj8eb8bab2015-07-21 14:44:28 +000089- When a thread has no stack then all system calls will result in Valgrind
90 crash, even though such system calls use just parameters passed in registers.
91 This should happen only in pathological situations when a thread is created
92 with custom mmap'ed stack and this stack is then unmap'ed during thread
93 execution.
94
95
96Remote debugging support
97------------------------
98Solaris port of GDB has a major flaw which prevents remote debugging from
99working correctly. Fortunately this flaw has an easy fix [4]. Unfortunately
100it is not present in the current GDB 7.6.2. This boils down to several
101options:
102- Use GDB shipped with Solaris 11.2 which has this flaw fixed.
103- Wait until GDB 7.7 becomes available (there won't be other 7.6.x releases).
104- Build GDB 7.6.2 with the fix by yourself using the following steps:
105 # pkg install developer/gnu-binutils
106 $ wget http://ftp.gnu.org/gnu/gdb/gdb-7.6.2.tar.gz
107 $ gzip -dc gdb-7.6.2.tar.gz | tar xf -
108 $ cd gdb-7.6.2
109 $ patch -p1 -i /path/to/valgrind-solaris/solaris/gdb-sol-thread.patch
110 $ export LIBS="-lncurses"
111 $ export CC="gcc -m64"
112 $ ./configure --with-x=no --with-curses --with-libexpat-prefix=/usr/lib
113 $ gmake && gmake install
114
115[4] https://sourceware.org/ml/gdb-patches/2013-12/msg00573.html
116
117
118TODO list
119---------
120- Fix few remaining failing tests.
121- Add more Solaris-specific tests (especially for the door and spawn
122 syscalls).
123- Provide better error reporting for various subsyscalls.
124- Implement storing of extra register state in signal frame.
125- Performance comparison against other platforms.
126
127- Prevent SIGPIPE when writing to a socket (coregrind/m_libcfile.c).
sewardj8eb8bab2015-07-21 14:44:28 +0000128- Implement ticket locking for fair scheduling (--fair-sched=yes).
129- Implement support in DRD and Helgrind tools for thr_join() with thread == 0.
130- Add support for accessing thread-local variables via gdb (auxprogs/getoff.c).
131 Requires research on internal libc TLS representation.
132- VEX supports AVX, BMI and AVX2. Investigate if they can be enabled on
133 Solaris/illumos.
134- Investigate support for more flags in AT_SUN_AUXFLAGS.
135- Fix Valgrind crash when a thread has no stack and syswrap-main.c accesses
136 all possible syscall parameters. Enable helgrind/tests/stackteardown.c
137 to see this in effect. Would require awareness of syscall parameter semantics.
138- Correctly print arguments of DW_CFA_ORCL_arg_loc in show_CF_instruction() when
139 it is implemented in libdwarf.
sewardj8eb8bab2015-07-21 14:44:28 +0000140
141
142Contacts
143--------
144Please send bug reports and any questions about the port to:
145Ivo Raisr <ivosh@ivosh.net>
146Petr Pavlu <setup@dagobah.cz>