Always RTFM.
As Zasti points out in that other thread, the manual doesn't mention "-fPIC". Apparently that's a "new" requirement. I don't know when it came in. Seems to me that "-shared" would always imply "-fPIC", but apparently not...
As I see it, your code, as posted, would have two addresses it needs to find: your format string "s", and printf itself. In 32-bit code, we need to do the call/pop "get_GOT" for "s". I would have expected that in 64-bit code, "default rel" would take care of "s"... but perhaps not. For printf, the manual says:
http://www.nasm.us/xdoc/2.10rc8/html/nasmdoc9.html#section-9.2.5call printf wrt ..plt
I guess that would still be required in 64-bit?
Your code, as posted, doesn't actually implement "strlen", of course. I would expect a "real strlen" to be position independent by default, no? In any case, we should know how to call a libc function if we need to.
Please feel free to talk about it here - post up a working example, if you've got one. Forum participants aren't "experts" with all the answers, we're "learners", trying to help one another. Please "be the teacher", when and if you can (everybody!). As it says about Nasm in section 1.1.1 of the manual - we know it ain't perfect, but with your help we'll try to improve it...
Best,
Frank