Defines are just passed to ASM, so macros in lbr can include needed code to get all functions to work. And that is at beginning of program memory. User code is translated to asm, and put at end of function.
If you look at disassembled code(eg in MPLAB), there is CLRF FLAGS(FLAGS is internal PBP variable used in LCDOUT, I2C etc functions), if is used. Then there is GOTO INIT. INIT is label at end of functions and user code starts from there.
So PBP takes care to always put code affected by DEFINES at top, and then your code.
I thing that PBP in first pass deal with defines, lib, variable allocation, etc, then in second pass deal with user code.