Ruby's mkmf generates the $objs for the Makefile by [looping over the files with SRC_EXT extensions](https://github.com/ruby/ruby/blob/9b7d8947df9780c120db7a1407bbe06e2004c511/lib/mkmf.rb#L2224-L2232), which are only [c, m, cc, mm, cxx, and cpp](https://github.com/ruby/ruby/blob/9b7d8947df9780c120db7a1407bbe06e2004c511/lib/mkmf.rb#L75-L88), not the `.S` we need here.
This instead explicitly uses the list of object files that Openwall's crypt_blowfish lists in its provided Makefile. See it's Makefile, lines 25-29:
```c
BLOWFISH_OBJS = \
crypt_blowfish.o x86.o
CRYPT_OBJS = \
$(BLOWFISH_OBJS) crypt_gensalt.o wrapper.o
```
Those are what's passed to Makefile > all on line 41:
```c
all: $(CRYPT_OBJS) man
```
This just uses that list plus the name of our actual extension (the `bcrypt_ext.o` entry) to ensure that the x86.S extension gets built in. That extension is only needed for 32-bit x86 systems, but it's fine to include on x64 as well, per the crypt_blowfish README: "you can compile and link it even on a non-x86, it will produce no code in this case".
This file was left out of #182, but is only necessary to compile on 32 bit/i386 architectures (which are currently still supported for the Windows builds). Without this file, all 32 bit Windows builds are failing. This should fix that!