Which addressing modes permits relocation without any change whatsoever in the code?
Code relocation can be done whenever addresses are not directly specified in the program (absolute), but are relative to some variable or other modifiable source. 

In the 2 modes that you correctly specified as able to support relocation of code and data, the effective address is calculated based on the value loaded in another register.  

For 3), base addressing, a register points to the base of the structure and the effective address is obtained by computing an offset from the base.  The base address register can be loaded at run time to point to the base of the structure so the code doesn't have to be modified.  

For 4), PC relative, the effective memory address is obtained by computing an offset from the current PC.  No matter where the code is loaded in memory, the offsets are always the same so the code needs no modification. 

Now the other 2 selections are a little more tricky.
1. Indirect addressing. This supports relocatable code since the effective address is determined based upon the contents of the initial load.  Code and data can move but with a data structure containing pointers to the code and/or data being at a fixed address. For example, the operating system may define that a pointer to the system's CPU database is always located at address 80002000, but the CPU database can be loaded at any address.    You COULD argue that the entire program is not relocatable because the pointers are at fixed locations, but really relocation is the one of the purposes of this addressing mode. 


Indexed Addressing.  This depends upon a bit more definition of the term.  If you mean indexed ABSOLUTE mode, then no, I wouldn't consider this to be a mode that supports relocation.  In this case the effective address of data is based on an offset from a literal fixed address (ex: 1000 + R5).  In order to relocate this data (or code) the literal address would have to be changed in the code.  If it's indexed relative to a base register, then yes it supports code relocation since the base register can be loaded at run time.