OK, so some experimentation and additional searching showed me that
GNU libc's fopen does not necessarily reside on /lib/libc.so.6. By
looking into a different shared lib, one reads
$ readelf -s /lib64/libc.so.6 |grep " fopen@"
162: 000000000005f4c0 10 FUNC GLOBAL DEFAULT 12 fopen@@GLIBC_2.2.5
which is precisely the version number that works with dlvsym().
How could I have found this programatically? To identify the version
of fopen being used, can I do better than
1) running ldd on an executable containing a call to fopen();
2) run readelf -s | grep fopen on each of the libs listed; and
3) using the first version string I find in 2) in my calls to dlvsym?