Hi, Below is a test case. ----------------- #include typedef int (*func)(); static int f() { return 0; } func a[] = {f, NULL}; int main(void) { func p = f; func q = a[0]; printf("p=%x\nq=%x\n", p, q); return 0; } ---------------- p and q should be equal. GAS created a R_BFIN_FUNCDESC relocation for f in a[] and a R_BFIN_FUNCDESC_GOT17M4 for f in main (). In a further pass, GAS adjusted f in R_BFIN_FUNCDESC relocation to section name but didn't for another f. Relocation section '.rela.text' at offset 0x3c0 contains 4 entries: Offset Info Type Sym.Value Sym. Name + Addend 0000001a 00000518 R_BFIN_FUNCDESC_G 00000000 _f + 0 Relocation section '.rela.data.rel.local' at offset 0x3f0 contains 1 entries: Offset Info Type Sym.Value Sym. Name + Addend 00000000 00000217 R_BFIN_FUNCDESC 00000000 .text + 0 Then ld created two function descriptors, one for _f + 0 and the other of .text + 0 and p and q were not equal. This patch should fix it by allowing GAS to adjust relocation. I don't think there is any reason why R_BFIN_GOT17M4 cannot be adjusted. So I changes it, too. Bernd pointed out that we should keep BFD_RELOC_BFIN_GOT unadjustable, "as the linker is not prepared to handle relocs of the form ".data+offset GOT", it needs a symbol. This is required for shared-flat." Committed. Jie