Estas son las funciones definidas:
typedef struct {
const char *name;
int structSize;
int (*open_r)(struct _reent *r, void *fileStruct, const char *path,int flags,int mode);
int (*close_r)(struct _reent *r,int fd);
int (*write_r)(struct _reent *r,int fd,const char *ptr,int len);
int (*read_r)(struct _reent *r,int fd,char *ptr,int len);
int (*seek_r)(struct _reent *r,int fd,int pos,int dir);
int (*fstat_r)(struct _reent *r,int fd,struct stat *st);
int (*stat_r)(struct _reent *r,const char *file,struct stat *st);
int (*link_r)(struct _reent *r,const char *existing, const char *newLink);
int (*unlink_r)(struct _reent *r,const char *name);
int (*chdir_r)(struct _reent *r,const char *name);
int (*rename_r) (struct _reent *r, const char *oldName, const char *newName);
int (*mkdir_r) (struct _reent *r, const char *path, int mode);
int dirStateSize;
DIR_ITER* (*diropen_r)(struct _reent *r, DIR_ITER *dirState, const char *path);
int (*dirreset_r)(struct _reent *r, DIR_ITER *dirState);
int (*dirnext_r)(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *filestat);
int (*dirclose_r)(struct _reent *r, DIR_ITER *dirState);
int (*statvfs_r) (struct _reent *r, const char *path, struct statvfs *buf);
} devoptab_t;
Vamos, que no solo es STDIO, sino que incluye funciones para renombrar, crear directorios, leer directorios, y statvfs que devuelve estadísticas sobre el sistema de archivos (espacio disponible, etc). En este caso, rmdir se implementa en forma de unlink (es decir se borran archivos y directorios con la misma llamada).
Por si te preguntas lo que es struct _reent, es una estructura que te permite trabajar con multithreading limpiamente. Por ejemplo, contiene una copia de errno para cada thread, que es el uso mas común (p.e. se usaría r->_errno = ENOENT; para indicar que un archivo no existe, en lugar de errno = ENOENT;)
También debo comentar, y esto es un pelín chanchullo, que realmente lo que se te pasa como "fd" a close, write, seek, etc no es mas que el void *fileStruct (así que hay que castearlo a un puntero), y que el FD que devuelvas desde el open() no importa (simplemente has de devolver -1 para error y cualquier numero positivo como OK - la gente suele devolver fileStruct), porque realmente todo queda abstraído al nivel de devoptab y el usuario trabaja con FDs en una tabla maestra - los devices trabajan directamente con la estructura fileStruct, que puede tener el tamaño que quieras (indicado en structSize) y el sistema automáticamente se encarga de hacer el malloc() y el free().