I'm not very familiar with 64-bit code, so I could be confused (it's been happening a lot lately!).
If I understand correctly, "[rel 0x26]" is in fact invalid code. Rather than raise an error (and stop), Nasm chooses to emit a warning and generate an absolute addressing mode (behind our back?). I don't know why. If your point is that this should be an error, I guess I agree. As you can see, 0x26 is no longer the correct address (if "foo" still existed, it would be at 0x2A). If we ran this code, we'd be scribbling on that last operand!
Different is not recognize segment part( Foo: in first exsample replaced with value and seg on second pass ) but they are equal
I don't see a "segment part" involved in either case. One of us is confused here, and it may not be me this time. As I understand the 64-bit world, we're forced into "flat memory model" with the exception of "fs:" and "gs:". Nasm will generate the other segment overrides if we say so, but warns that they will be ignored. At least it does what we say...
Since you mention "passes"... If we put "v" at the end of the "-O" switch, Nasm will burp up how many passes it actually took. Turns out that if we say "rel", Nasm takes 3 passes, even if we specify "-O0v". If we leave it at "abs", only 2 passes. I didn't know that.
If I misunderstand what you're "getting at" here, MaxMax - try me again...
Best,
Frank