I did a little looking into this this evening. This assessment looks to
be correct as it looks to be related to compiler optimizations. With
the optimizations disabled in Make.inc, FreeRADIUS will start up on the
correct port. For the fr_socket function, gcc appears to be optimizing
the arguments by sending them through the registers instead of the stack
frame, but the "port" argument is being clobbered ("optimized out")
before the htons(port) call. Specifically, according to a step-through
with GDB, after the first function call in fr_socket (which is to
socket()), the port variable is gone ("optimized out").