If you read the data in using limma, you already get some annotation. As an example, using GSE86970:
> dat <- read.maimages(fls, "agilent.median", green.only = TRUE)
> head(dat$genes[dat$genes$ControlType == 0,])
Row Col ControlType ProbeName SystematicName
4 1 4 0 A_23_P117082 NM_015987
5 1 5 0 A_33_P3246448 NM_080671
6 1 6 0 A_33_P3318220 NM_178466
7 1 7 0 A_33_P3236322 AK128005
8 1 8 0 A_33_P3319925 ENST00000449753
9 1 9 0 A_21_P0000509 NR_024244
The SystematicName is now a mixture of RefSeq and GenBank IDs, Ensembl transcript IDs, which would be a bit of a drag to annotate. Luckily others have already done that for you. We can get the GPL for this array from GEO as well.
> z <- getGEO("GPL21061")
> zz <- Table(z)
> dat$genes <- cbind(dat$genes, zz[match(dat$genes$ProbeName, zz$ID),1:4])
Then you can do all the pre-processing and QC and comparisons, and when you use topTable, you will get all the annotations. Prior to doing topTable you might want to subset to just the columns of interest in the genes list item, as things like the Row or Col, etc are not usually of interest.