<p>When the macro is expanded, it means that <code>(function)(args)</code> is
actually expanded to <code>linuxDev->driver->remove(linuxDev)</code>.
Therefore, we see <code>LinuxPCIDeviceRemoved()</code>, makes directs calls
to a driver's remove() function, by combining with Linux's <code>struct
pci</code>, and by VMware's introduction of this new calling code.
Conservancy has confirmed many drivers from Linux are incorporated via
these mechanisms; one specific example is discussed next.</p>
<h4>Combination of the tg3 driver with “vmkernel”</h4>
<p>VMware includes a file <code>vmkdrivers/src_9/drivers/net/tg3/tg3.c</code>
in their source release. This file appears to be Linux's tg3 driver. It
includes a definition of the <code>struct pci_dev</code> for this device,
which reads:
<pre>
static struct pci_driver tg3_driver = {
[...]
.remove = __devexit_p(tg3_remove_one),
</pre>
</p>
<p>Therefore, when the code in <code>LinuxPCIDeviceRemoved()</code>
calls <code>linuxDev->driver->remove(linuxDev)</code>, the code ultimately
called (in the case where a tg3 card is driven by the kernel)
is <code>tg3_remove_one()</code>, which is found in <code>tg3.c</code> and
comes directly from Linux.</p>
<p>(Note: <code>__devexit_p</code> is a straightforward macro found
in <code>vmkdrivers/src_92/include/linux/init.h</code> (which also comes
from Linux) that will simply expand to its first argument in this
case.)</p>
<h4>VMware distribution of binary version of <code>tg3.c</code></h4>
<p>VMware furthermore distributes a modified version of <code>tg.c</code> in
binary form. This can be found in <code>usr/lib/vmware/vmkmod/tg3</code>,
which is extracted by un-vmtar'ing the file <code>net_tg3.v00</code> (found
on the ESXi 5.5U2 installer ISO image). Conservancy has confirmed that
file is a compiled version of <code>tg3.c</code></p>
<h4>Conclusions</h4>
<p>Given this evidence and related contextual clues, the only logical
conclusions are:</p>
<ul><li><code>vmklinux_9</code>, as a binary object, dynamically links
with <code>k.b00</code>, another binary object, to form a single running
binary.</li>
<li>That binary contains code licensed under the GPLv2, and can be
distributed in binary form only under permissions provided under
GPLv2 — in particular <a href="https://gnu.org/licenses/gpl-2.0.html#section2">GPLv2§2</a> and <a href="https://gnu.org/licenses/gpl-2.0.html#section3">GPLv2§3</a>.</li>
<ul><li><code>vmklinux_9</code>, a binary object, dynamically links with
the binary objects: <code>k.b00</code> and <code>tg3</code> (the
driver built from <code>tg3.c</code>'s source). These three binary
objects together form a single running binary (likely along with many
other binary objects as well).</li>
<li>That single running binary contains code licensed under the GPLv2
— namely the code derived from <code>tg3.c</code>
and <code>pci.h</code>. Thus, the single running binary may be
distributed in binary form only under permissions provided under GPLv2