Yeah, so telling from GCC's crtstuff.c your explanation is clearly wrong right now. Correct explanation would be: crtbegin.o contains the beginnings of both the c-tor and the d-tor lists. crtend.o containts the ending of both these lists.
crtstuff.c
crtbegin.o
crtend.o