<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>FreeBSD on bramp.net</title>
    <link>https://blog.bramp.net/</link>
    <description>Recent content in FreeBSD on bramp.net</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <lastBuildDate>Thu, 14 Jan 2010 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.bramp.net/tags/freebsd/" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Installing packages into your user directory</title>
      <link>https://blog.bramp.net/post/2010/01/14/installing-packages-into-your-user-directory/</link>
      <pubDate>Thu, 14 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2010/01/14/installing-packages-into-your-user-directory/</guid>
      <description><p>Today I had the need to install some <a href="http://www.freebsd.org/">FreeBSD</a> and <a href="http://www.ubuntu.com/">Ubuntu</a> packages inside my home directory because I did not have root permissions to install them.</p>
<p>It was quite simple to install the packages on FreeBSD</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pkg_add -rRP /home/bramp nano
</span></span></code></pre></div><p>Where nano is the name of the package I wanted.</p>
<p>I should point out you don’t need to be root to do this!, but the installed packages only work for you, and in future could cause you hassle if the base OS is updated.</p>
<p>On Ubuntu I however failed :( I tried the “–root” option and did some <a href="http://ubuntuforums.org/archive/index.php/t-513933.html">Googleing</a> but I didn’t find a solution. Unitl then I’ll just install from source.</p>
</description>
    </item>
    
    <item>
      <title>Updating…/-\|/-|</title>
      <link>https://blog.bramp.net/post/2009/12/19/updating-%5C/</link>
      <pubDate>Sat, 19 Dec 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/12/19/updating-%5C/</guid>
      <description><p>Do people other than me find updating their servers to be relaxing? At every opportunity I run “apt-get update”. Today I’m updating 7 different machines simultaneously.</p>
<p>My Debian machines I simply issue the following commands:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get update
</span></span><span class="line"><span class="cl">apt-get upgrade
</span></span></code></pre></div><p>My FreeBSD machines:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">portsnap fetch update
</span></span><span class="line"><span class="cl">portmanager -u
</span></span></code></pre></div><p>I think the Debian process is easier (and clearly the fastest) but it obviously has to do less work because I’m downloading precompiled code. Portmanager is just as easy but seems to randomly ask me questions through the process whereas apt-get seems to get them out of the way early on. Either way I find this all very easy and relaxing… until I have to reboot the machines and find something is broken :/</p>
</description>
    </item>
    
    <item>
      <title>Useful scripts/configurations</title>
      <link>https://blog.bramp.net/post/2009/11/28/useful-scripts-configurations/</link>
      <pubDate>Sat, 28 Nov 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/11/28/useful-scripts-configurations/</guid>
      <description><p>Make <a href="http://git-scm.com">git</a> colourful</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global color.diff auto
</span></span><span class="line"><span class="cl">git config --global color.status auto
</span></span><span class="line"><span class="cl">git config --global color.branch auto
</span></span></code></pre></div><p>Make <a href="http://www.nano-editor.org/">nano</a> colourful</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp /usr/local/share/examples/nano/nanorc.sample ~/.nanorc
</span></span><span class="line"><span class="cl"><span class="c1"># or</span>
</span></span><span class="line"><span class="cl">zcat /usr/share/doc/nano/examples/nanorc.sample.gz &gt;~/.nanorc
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># then</span>
</span></span><span class="line"><span class="cl">nano ~/.nanorc
</span></span></code></pre></div><p>To trim trailing whitespace from *.cc on Linux (taken from <a href="http://zebert.blogspot.com/2009/06/clean-up-trailing-whitespaces-in.html">this blog</a>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">find . -name <span class="s1">&#39;*.cc&#39;</span> -exec sed -i <span class="o">{}</span> -e <span class="s1">&#39;s/[ \t]*$//&#39;</span> <span class="s1">&#39;;&#39;</span>
</span></span></code></pre></div><p>and on BSDs:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">find . -name <span class="s1">&#39;*.cc&#39;</span> -exec sed -i <span class="s1">&#39;&#39;</span> -e <span class="s1">&#39;s/\ *$//&#39;</span> <span class="o">{}</span> <span class="s1">&#39;;&#39;</span>
</span></span></code></pre></div><p>Linux style ‘ls’ colours on FreeBSD (taken from <a href="http://www.puresimplicity.net/~hemi/freebsd/misc.html">here</a>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLICOLOR</span><span class="o">=</span><span class="s2">&#34;YES&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">LSCOLORS</span><span class="o">=</span><span class="s2">&#34;ExGxFxdxCxDxDxhbadExEx&#34;</span>
</span></span></code></pre></div><p>To ensure the http_proxy environmental variable is passed to sudo. Edit the sudoers file by running visudo. Then add the following.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Defaults <span class="nv">env_keep</span> <span class="o">+=</span> <span class="s2">&#34;ftp_proxy http_proxy https_proxy&#34;</span>
</span></span></code></pre></div><p>Bash autocompletion on FreeBSD:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span>  /usr/ports/shells/bash-completion
</span></span><span class="line"><span class="cl">sudo make install clean
</span></span></code></pre></div><p>Edit ~/.bashrc and add</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -f /usr/local/etc/bash_completion <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    . /usr/local/etc/bash_completion
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>Make svn output colorful<br>
Edit ~/.subversion/config</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[helpers]</span>
</span></span><span class="line"><span class="cl"><span class="na">diff-cmd</span> <span class="o">=</span> <span class="s">/usr/bin/colordiff</span>
</span></span></code></pre></div><p>Create diffs with function names and ignoring whitespace</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">svn diff -x -uwp
</span></span></code></pre></div><p>To be continued…</p>
</description>
    </item>
    
    <item>
      <title>FreeBSD Software Watchdog</title>
      <link>https://blog.bramp.net/post/2009/10/16/freebsd-software-watchdog/</link>
      <pubDate>Fri, 16 Oct 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/10/16/freebsd-software-watchdog/</guid>
      <description><p>Recently I’ve been doing some kernel hacking and I managed to deadlock my system. The system still responded to pings but the terminal was unresponsive, and it needed a hard reboot to fix. I would have loved to drop into a debugger or panic’ed the kernel to get a suitable back-trace.</p>
<p>I found that FreeBSD has a software watchdog feature, that will panic the kernel if a problem like this occurs. The watchdog does not seem to be built into the kernel by default, and I found the documentation a bit lacking. So here is what I did:</p>
<p>Firstly, build and install a custom kernel which includes: <code>options SW_WATCHDOG</code></p>
<p>Secondly, edit the <code>/etc/rc.conf</code> file and add a line: <code>watchdogd_enable=&quot;YES&quot;</code></p>
<p>When you next reboot, the watchdogd daemon will run, enabling the watchdog feature. Every second the watchdogd will reset a timer within the kernel. If after 16 seconds the timer has not been reset, the kernel will print out some interrupt information, and panic.</p>
<p>Watchdogd seems to have some useful features, for example, you can configure it to execute a specific command every second, and if that command fails the timer will not be reset. The configuration option I use is: <code>watchdogd_flags=&quot;-e /bin/ps&quot;</code></p>
<p>Read <a href="http://www.freebsd.org/cgi/man.cgi?query=watchdogd&amp;sektion=8">WATCHDOGD(8)</a> for more information.</p>
</description>
    </item>
    
    <item>
      <title>memcmp broken in the FreeBSD kernel</title>
      <link>https://blog.bramp.net/post/2009/08/10/memcmp-broken-in-the-freebsd-kernel/</link>
      <pubDate>Mon, 10 Aug 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/08/10/memcmp-broken-in-the-freebsd-kernel/</guid>
      <description><p>I’ve spent a day tracking down a bug in a FreeBSD kernel module I’m developing, and to my surprise the bug was due to memcmp being broken! For those that don’t know, memcmp is used to compare two byte strings and returns 0 if they are identical, a negative number of the first string is less than the second, and a positive number of the first string is greater than the second.</p>
<p>However, the implementation of memcmp in the FreeBSD kernel looks like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">static</span> <span class="kr">__inline</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="nf">memcmp</span><span class="p">(</span><span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">b1</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">b2</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">len</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span><span class="nf">bcmp</span><span class="p">(</span><span class="n">b1</span><span class="p">,</span> <span class="n">b2</span><span class="p">,</span> <span class="n">len</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The problem with this is that bcmp is defined to return 0 if the strings are identical, otherwise returns a non-zero integer. This is not the same as memcmp, and you would only notice this if you are testing the signedness of the return value. I suspect this has not been noticed because traditionally FreeBSD has favoured bcmp, and in the few cases it does uses memcmp it only compares it with zero.</p>
<p>There is some good news, obrien@ noticed this problem in September 2008 and commited a patch (svn r183299). However, it looks like this fix won’t be included until FreeBSD 8.0. In the mean time I’m implementing a minor hack to fix this.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">my_memcmp</span><span class="p">(</span><span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">s1</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">s2</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="n">p1</span> <span class="o">=</span> <span class="n">s1</span><span class="p">,</span> <span class="o">*</span><span class="n">p2</span> <span class="o">=</span> <span class="n">s2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">do</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="n">p1</span><span class="o">++</span> <span class="o">!=</span> <span class="o">*</span><span class="n">p2</span><span class="o">++</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">return</span> <span class="p">(</span><span class="o">*--</span><span class="n">p1</span> <span class="o">-</span> <span class="o">*--</span><span class="n">p2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="o">--</span><span class="n">n</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="cp">#define memcmp my_memcmp
</span></span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>Threadnetperf v1.0</title>
      <link>https://blog.bramp.net/post/2009/06/01/threadnetperf-v1.0/</link>
      <pubDate>Mon, 01 Jun 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/06/01/threadnetperf-v1.0/</guid>
      <description><p>Today I am proud to announce that I’m releasing a tool I’ve used privately for well over a year now. It is a multi-threaded network testing tool which gives the user great control over how many connections, threads and processes the tool uses, and which CPU cores the threads/processes are allowed to execute on.</p>
<p>Currently the tool runs on Linux, FreeBSD, and Windows, and has performance as good as (if not better) than other similar tools, such as netperf, iperf, but with the added flexibility. Additionally, Threadnetperf has been completely written from scratch in C, using modern programming techniques and APIs (such as ePoll on Linux) which ensures the program runs as far as possible with minimal overheads.</p>
<p>You can <a href="https://github.com/bramp/threadnetperf">download the source from GitHub</a>, which contains instructions on how to build it.</p>
<p>So that you get an extra idea of it’s features here is the README.txt</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">****** Threadnetperf ******
</span></span><span class="line"><span class="cl">A multi-threaded network benchmark tool
</span></span><span class="line"><span class="cl"> by  Andrew Brampton (2007-2009)
</span></span><span class="line"><span class="cl"> and Mathew Faulkner (2007-2009)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Threadnetperf is a highly customisable high performance network benchmarking
</span></span><span class="line"><span class="cl">tool. The key difference from previous tools is that the user is able to control
</span></span><span class="line"><span class="cl">how many threads threadnetperf uses, as well as which cores these threads are
</span></span><span class="line"><span class="cl">pinned to. This tool was useful in our research for measuring the effect of
</span></span><span class="line"><span class="cl">sending or receiving from one core, and having the OS network stack run on
</span></span><span class="line"><span class="cl">another core. Additionally the tool can be configured to use an unlimited number
</span></span><span class="line"><span class="cl">of connections, threads or processes, which scale considerably well due to the
</span></span><span class="line"><span class="cl">use of the epoll API.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Threadnetperf has previously worked on Windows, Linux, and FreeBSD, however, we
</span></span><span class="line"><span class="cl">do not test it very rigorously so one of these platforms may be broken. All
</span></span><span class="line"><span class="cl">patches are welcome.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">To build on a *nix style system just use the simple &#34;Makefile&#34; by executing the
</span></span><span class="line"><span class="cl">command &#34;make&#34; or &#34;gmake&#34;. To build on Windows just use the provided
</span></span><span class="line"><span class="cl">threadnetperf.2008.sln file.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">All the commands of Threadnetperf are documented within the application, but a
</span></span><span class="line"><span class="cl">quick overview is here:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Usage: threadnetperf [options] tests
</span></span><span class="line"><span class="cl">Usage: threadnetperf -D [options]
</span></span><span class="line"><span class="cl">       -c level,interval   Confidence level, must be 95 or 99
</span></span><span class="line"><span class="cl">       -D         Use daemon mode (wait for incoming tests)
</span></span><span class="line"><span class="cl">       -d time    Set duration to run the test for
</span></span><span class="line"><span class="cl">       -e         Eat the data (i.e. dirty it)
</span></span><span class="line"><span class="cl">       -H host    Set the remote host(and port) to connect to
</span></span><span class="line"><span class="cl">       -h         Display this help
</span></span><span class="line"><span class="cl">       -i min,max Set the minimum and maximum iterations
</span></span><span class="line"><span class="cl">       -m [t,p]   What programming model to use, [thread or process]
</span></span><span class="line"><span class="cl">       -n         Disable Nagle&#39;s algorithm (e.g no delay)
</span></span><span class="line"><span class="cl">       -p port    Set the port number for the first server thread to use
</span></span><span class="line"><span class="cl">       -s size    Set the send/recv size
</span></span><span class="line"><span class="cl">       -T         Timestamp packets, and measure latency (only on *nix)
</span></span><span class="line"><span class="cl">       -t         Use TCP
</span></span><span class="line"><span class="cl">       -r         Packets per second rate (default: ~0)
</span></span><span class="line"><span class="cl">       -u         Use UDP
</span></span><span class="line"><span class="cl">       -v         Verbose
</span></span><span class="line"><span class="cl">       -V         Display version only
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">       tests      Combination of cores and clients
</span></span><span class="line"><span class="cl">       tests      Core numbers are masks, for example 1 is core 0, 3 is core 0
</span></span><span class="line"><span class="cl">and core 1
</span></span><span class="line"><span class="cl">               N{c-s}   N connections
</span></span><span class="line"><span class="cl">                        c client cores mask
</span></span><span class="line"><span class="cl">                        s server cores mask
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You can run tests locally, or across two machines. Here are some examples:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    threadnetperf -n -s 10000 1{1-1}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Will run a local TCP test, with Nagle&#39;s algorithm disabled, a send size of
</span></span><span class="line"><span class="cl">10,000, and 1 TCP connection between cores 0 and 0.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    threadnetperf 10{1-1} 10{2-2} 10{4-4}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Will again run a local TCP test, however this time 10 connection from core 0 to
</span></span><span class="line"><span class="cl">core 0, 10 connections from core 1 to core 1, and 10 connections from core 2 to
</span></span><span class="line"><span class="cl">core 2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">To run across a network just start the threadnetperf daemon on one of the
</span></span><span class="line"><span class="cl">machines like so:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">     threadnetperf -D
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">and on the other machine execute:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">     threadnetperf -H serverIP 1{1-2}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">which will conduct a TCP test from the client to the server, with one thread
</span></span><span class="line"><span class="cl">executing on client&#39;s core 0, and the server&#39;s core 1.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">There is no need to give the threadnetperf daemon any options, as the options
</span></span><span class="line"><span class="cl">configured on the server will be passed over the network. This make running many
</span></span><span class="line"><span class="cl">tests very easy as the daemon will continue to wait for new tests until it is
</span></span><span class="line"><span class="cl">told otherwise.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">If you find this tool useful, or you have any suggestions for improvements then
</span></span><span class="line"><span class="cl">please contact us.
</span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>Compiler defined symbols</title>
      <link>https://blog.bramp.net/post/2009/03/06/compiler-defined-symbols/</link>
      <pubDate>Fri, 06 Mar 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/03/06/compiler-defined-symbols/</guid>
      <description><p>I found this neat little command to list all the GCC compiler defined symbols</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gcc -dM -E - &gt; /dev/null
</span></span></code></pre></div><p>This can help if you aren&rsquo;t quite sure which defines are used on your systems. For example my FreeBSD 7.1 machine outputs this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#define __DBL_MIN_EXP__ (-1021)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MIN__ 1.17549435e-38F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_DEN__ 0.000000000000001E-383DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __CHAR_BIT__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __WCHAR_MAX__ 2147483647
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_EVAL_METHOD__ 0
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MIN_10_EXP__ (-307)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FINITE_MATH_ONLY__ 0
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MAX_EXP__ 384
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SHRT_MAX__ 32767
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MAX__ 1.18973149535723176502e+4932L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __UINTMAX_TYPE__ long unsigned int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_EPSILON__ 1E-6DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __unix 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SCHAR_MAX__ 127
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __USER_LABEL_PREFIX__
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __STDC_HOSTED__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MIN_EXP__ (-383)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_DIG__ 15
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_EPSILON__ 1.19209290e-7F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MIN__ 3.36210314311209350626e-4932L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MAX__ 9.999999E96DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __unix__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DECIMAL_DIG__ 21
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_HAS_QUIET_NAN__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC__ 4
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __MMX__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_HAS_DENORM__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FreeBSD_cc_version 700003
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MAX__ 1.7976931348623157e+308
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_HAS_INFINITY__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MIN_EXP__ (-95)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_HAS_DENORM__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MIN__ 1E-95DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MAX_EXP__ 1024
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_EPSILON__ 1E-33DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE2_MATH__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __amd64 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LONG_LONG_MAX__ 9223372036854775807LL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GXX_ABI_VERSION 1002
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MIN_EXP__ (-125)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __x86_64 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MIN__ 2.2250738585072014e-308
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LP64__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_HAS_QUIET_NAN__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MIN__ 1E-6143DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __REGISTER_PREFIX__
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_HAS_DENORM__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __NO_INLINE__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC_EVAL_METHOD__ 2
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MANT_DIG__ 24
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __VERSION__ &#34;4.2.1 20070719  [FreeBSD]&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_EPSILON__ 1E-15DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MIN_EXP__ (-6143)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define unix 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZE_TYPE__ long unsigned int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_DEN__ 0.000001E-95DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __ELF__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_RADIX__ 2
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FreeBSD__ 7
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE_MATH__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __k8 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_DIG__ 18
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __KPRINTF_ATTRIBUTE__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __x86_64__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_HAS_QUIET_NAN__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MAX_10_EXP__ 38
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LONG_MAX__ 9223372036854775807L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_HAS_INFINITY__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MAX__ 9.999999999999999E384DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MANT_DIG__ 16
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MAX_EXP__ 96
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_DEN__ 0.000000000000000000000000000000001E-6143DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MANT_DIG__ 64
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _LONGLONG 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MANT_DIG__ 7
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __k8__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __WCHAR_TYPE__ int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_DIG__ 6
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __INT_MAX__ 2147483647
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MAX_EXP__ 128
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MANT_DIG__ 53
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MIN__ 1E-383DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __WINT_TYPE__ unsigned int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MIN_EXP__ (-16381)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __amd64__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MAX_EXP__ 16384
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MAX_10_EXP__ 4932
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_EPSILON__ 2.2204460492503131e-16
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _LP64 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC_PATCHLEVEL__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_HAS_INFINITY__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __INTMAX_MAX__ 9223372036854775807L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_DENORM_MIN__ 1.40129846e-45F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MAX__ 3.40282347e+38F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE2__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MIN_10_EXP__ (-37)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __INTMAX_TYPE__ long int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MAX_EXP__ 6144
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC_MINOR__ 2
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MAX_10_EXP__ 308
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __STDC__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __PTRDIFF_TYPE__ long int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MANT_DIG__ 34
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MIN_10_EXP__ (-4931)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC_GNU_INLINE__ 1
</span></span></span></code></pre></div><p>and my Debian Linux machine outputs this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#define __DBL_MIN_EXP__ (-1021)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MIN__ 1.17549435e-38F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_DEN__ 0.000000000000001E-383DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __CHAR_BIT__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __WCHAR_MAX__ 2147483647
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_EVAL_METHOD__ 0
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __unix__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __x86_64 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MIN_10_EXP__ (-307)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FINITE_MATH_ONLY__ 0
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC_PATCHLEVEL__ 3
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MAX_EXP__ 384
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SHRT_MAX__ 32767
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MAX__ 1.18973149535723176502e+4932L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __UINTMAX_TYPE__ long unsigned int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __linux 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_EPSILON__ 1E-6DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __unix 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MAX_EXP__ 16384
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __linux__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SCHAR_MAX__ 127
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_DIG__ 15
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_INT__ 4
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_POINTER__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __USER_LABEL_PREFIX__
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __STDC_HOSTED__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_HAS_INFINITY__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_EPSILON__ 1.19209290e-7F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MIN__ 3.36210314311209350626e-4932L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MAX__ 9.999999E96DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_LONG__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DECIMAL_DIG__ 21
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __gnu_linux__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_HAS_QUIET_NAN__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC__ 4
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __MMX__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_HAS_DENORM__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_LONG_DOUBLE__ 16
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MAX__ 1.7976931348623157e+308
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_HAS_INFINITY__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MIN_EXP__ (-95)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_HAS_DENORM__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MIN__ 1E-95DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MAX_EXP__ 1024
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_EPSILON__ 1E-33DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE2_MATH__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __amd64 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LONG_LONG_MAX__ 9223372036854775807LL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_SIZE_T__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_WINT_T__ 4
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GXX_ABI_VERSION 1002
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MIN_EXP__ (-125)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MIN__ 2.2250738585072014e-308
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LP64__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DECIMAL_BID_FORMAT__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MIN__ 1E-6143DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __REGISTER_PREFIX__
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_HAS_DENORM__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __NO_INLINE__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MANT_DIG__ 24
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __VERSION__ &#34;4.3.3&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_EPSILON__ 1E-15DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MIN_EXP__ (-6143)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define unix 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZE_TYPE__ long unsigned int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_DEN__ 0.000001E-95DF
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __ELF__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_RADIX__ 2
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE_MATH__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __k8 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_PTRDIFF_T__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __x86_64__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_HAS_QUIET_NAN__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MAX_10_EXP__ 38
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LONG_MAX__ 9223372036854775807L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_HAS_INFINITY__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MAX__ 9.999999999999999E384DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MANT_DIG__ 16
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MAX_EXP__ 96
</span></span></span><span class="line"><span class="cl"><span class="cp">#define linux 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_DEN__ 0.000000000000000000000000000000001E-6143DL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE2__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MANT_DIG__ 64
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_HAS_QUIET_NAN__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __k8__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __WCHAR_TYPE__ int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_FLOAT__ 4
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MIN_EXP__ (-383)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_DIG__ 6
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __INT_MAX__ 2147483647
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __amd64__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MAX_EXP__ 128
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MANT_DIG__ 53
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC64_MIN__ 1E-383DD
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __WINT_TYPE__ unsigned int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_SHORT__ 2
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SSE__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MIN_EXP__ (-16381)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MAX_10_EXP__ 4932
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_EPSILON__ 2.2204460492503131e-16
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _LP64 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_WCHAR_T__ 4
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC_EVAL_METHOD__ 2
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __INTMAX_MAX__ 9223372036854775807L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_DENORM_MIN__ 1.40129846e-45F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MAX__ 3.40282347e+38F
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_DOUBLE__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __FLT_MIN_10_EXP__ (-37)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __INTMAX_TYPE__ long int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MAX_EXP__ 6144
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC_MINOR__ 3
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC32_MANT_DIG__ 7
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DBL_MAX_10_EXP__ 308
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __STDC__ 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __PTRDIFF_TYPE__ long int
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __DEC128_MANT_DIG__ 34
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_MIN_10_EXP__ (-4931)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __SIZEOF_LONG_LONG__ 8
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __LDBL_DIG__ 18
</span></span></span><span class="line"><span class="cl"><span class="cp">#define __GNUC_GNU_INLINE__ 1
</span></span></span></code></pre></div></description>
    </item>
    
    <item>
      <title>Autoload symbols for FreeBSD kernel module</title>
      <link>https://blog.bramp.net/post/2009/01/11/autoload-symbols-for-freebsd-kernel-module/</link>
      <pubDate>Sun, 11 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/01/11/autoload-symbols-for-freebsd-kernel-module/</guid>
      <description><p>When debugging FreeBSD kernel modules with GDB, you have to tell GDB the correct symbols for the module, and the location the module is loaded in RAM. This is helpfully explained in the <a href="http://www.freebsd.org/doc/en/books/developers-handbook/kerneldebug-kld.html">FreeBSD Developers’ Handbook</a>. First you must load the module, then run kldstat, note down the address the module is loaded at, and finally execute a command in GDB that looks like the following.</p>
<pre tabindex="0"><code>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
</code></pre><p>However, I find this process tedious, so instead I wrote a quick python script which can be used with an <a href="http://sourceware.org/gdb/wiki/PythonGdb">experimental gdb built with python scripting support</a>.</p>
<p>So here is the script:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">gdb</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">FreeBSD_ReloadModuleSymbols</span> <span class="p">(</span><span class="n">gdb</span><span class="o">.</span><span class="n">Command</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="s2">&#34;Reloads the symbol files for all loaded kernel modules&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">def</span> <span class="fm">__init__</span> <span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="nb">super</span> <span class="p">(</span><span class="n">FreeBSD_ReloadModuleSymbols</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span> <span class="p">(</span><span class="s2">&#34;reload-freebsd-module-symbols&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">gdb</span><span class="o">.</span><span class="n">COMMAND_FILES</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">			<span class="n">gdb</span><span class="o">.</span><span class="n">COMPLETE_NONE</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">def</span> <span class="nf">invoke</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">,</span> <span class="n">from_tty</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">link</span> <span class="o">=</span> <span class="n">gdb</span><span class="o">.</span><span class="n">parse_and_eval</span><span class="p">(</span><span class="s2">&#34;linker_files-&amp;gt;tqh_first&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">while</span> <span class="n">link</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="nb">print</span> <span class="n">link</span><span class="p">[</span><span class="s1">&#39;filename&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">string</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="n">link</span><span class="p">[</span><span class="s1">&#39;filename&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">string</span><span class="p">()</span> <span class="o">!=</span> <span class="s2">&#34;kernel&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">gdb</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span> <span class="s2">&#34;add-symbol-file &#34;</span> <span class="o">+</span> 
</span></span><span class="line"><span class="cl">					<span class="n">link</span><span class="p">[</span><span class="s1">&#39;pathname&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">string</span><span class="p">()</span> <span class="o">+</span> <span class="s2">&#34; &#34;</span> <span class="o">+</span>  
</span></span><span class="line"><span class="cl">					<span class="nb">str</span><span class="p">(</span><span class="n">link</span><span class="p">[</span><span class="s1">&#39;address&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">address</span><span class="p">())</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="n">link</span> <span class="o">=</span> <span class="n">link</span><span class="p">[</span><span class="s1">&#39;link&#39;</span><span class="p">][</span><span class="s1">&#39;tqe_next&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">FreeBSD_ReloadModuleSymbols</span> <span class="p">()</span>
</span></span></code></pre></div><p>You load this by running the following command in GDB:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">source</span> freebsd_load_modules.py
</span></span></code></pre></div><p>Then the command <code>reload-freebsd-module-symbols</code> is magically added to GDB. Running this command will parse the linker table inside the FreeBSD kernel, determine which modules are loaded, and attempt to load their symbols.</p>
</description>
    </item>
    
    <item>
      <title>linuxoffsets for FreeBSD</title>
      <link>https://blog.bramp.net/post/2009/01/11/linuxoffsets-for-freebsd/</link>
      <pubDate>Sun, 11 Jan 2009 00:00:00 +0000</pubDate>
      
      <guid>https://blog.bramp.net/post/2009/01/11/linuxoffsets-for-freebsd/</guid>
      <description><p>VMWare 6 and above has this neat debugging functionality where you can attach gdb running on a host, to a guest running inside VMWare. This allows you to debug a running kernel, or on linux running processes.</p>
<p>However, VMWare seems to have coded a bit of a hack to allow gdb to understand what process/threads are inside the virtual machine. Now this hack involves using something called linuxoffsets, which provides the offset for certain fields in a linux kernel struct.</p>
<p>So I thought I could abuse these offsets, and hopefully make them work for FreeBSD. The Linux offsets are:</p>















<table class="table">
  <thead>
      <tr>
          <th></th>
          <th>Linux Values</th>
          <th>FreeBSD 7.1 Values</th>
          <th>Notes</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>&lt;version&gt;</td>
          <td></td>
          <td></td>
          <td>Version number of linux kernel, ie 0x020609 (2.6.9)</td>
      </tr>
      <tr>
          <td>&lt;mm&gt;</td>
          <td>task_struct-&gt;mm</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;next_task&gt;</td>
          <td>task_struct-&gt;next_task (linux &lt; 2.4.15)</td>
          <td>struct proc-&gt;p_list-&gt;le_next</td>
          <td>Pointer to next task struct</td>
      </tr>
      <tr>
          <td>&lt;tasks&gt;</td>
          <td>task_struct-&gt;tasks (linux &gt;= 2.4.15)</td>
          <td>0</td>
          <td>Pointers to prev and next task struct</td>
      </tr>
      <tr>
          <td>&lt;comm&gt;</td>
          <td>task_struct-&gt;comm</td>
          <td>struct proc-&gt;p_comm</td>
          <td>executable name</td>
      </tr>
      <tr>
          <td>&lt;pid&gt;</td>
          <td>task_struct-&gt;pid</td>
          <td>struct proc-&gt;p_pid</td>
          <td>pid of the process</td>
      </tr>
      <tr>
          <td>&lt;thread&gt;</td>
          <td>task_struct-&gt;thread</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;pgd&gt;</td>
          <td>mm_struct-&gt;pgd</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;rsp0/esp0&gt;</td>
          <td>thread_struct-&gt;rsp0 (or thread_struct-&gt;esp0 32bit)</td>
          <td>struct thread-&gt;td_sigstk-&gt;ss_sp</td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;fs&gt;</td>
          <td>thread_struct-&gt;fs</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;threadsize&gt;</td>
          <td>0x2000 or sizeof(union thread_union-&gt;stack) (linux &gt;= 2.6)</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;grouplead&gt;</td>
          <td>task_struct-&gt;group_leader (linux &gt;= 2.6.11)</td>
          <td>0</td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;threadgroup&gt;</td>
          <td>task_struct-&gt;thread_group (linux &gt;= 2.6.11)</td>
          <td>0</td>
          <td></td>
      </tr>
      <tr>
          <td>&lt;commsize&gt;</td>
          <td>sizeof(struct task_struct-&gt;comm)</td>
          <td>sizeof(struct proc-&gt;p_comm)</td>
          <td>executable name’s max len</td>
      </tr>
  </tbody>
</table>

<p>However, after some time I feel this isn’t going to be possible. Each value represents a offset into a Linux task_struct struct, however, nothing represents the location of the first task_struct in RAM. I suspect VMWare is figuring out the location via some other means. Since FreeBSD doesn’t have a task_struct it most likely won’t be able to find what it needs.</p>
<p>Regardless I’ve posted this entry in case someone wants to continue my work. However, not all is lost as my next solution involves playing with gdb-python.</p>
</description>
    </item>
    
  </channel>
</rss>
