All files in
/proc are generated on demand. They sometimes behave slightly differently from ordinary files because of that.
For example, many files in
/proc appear as regular files with a size of 0 in directory listings. Yet, when you read from them, they aren't empty. The reason is that the content of the file is generated on demand. The content can vary over time and can even depend on the process that opens the file. So there's no way to know the size of the content without opening the file and reading from it.
/proc/<pid>/exe is a reference to an open file description inside the kernel. There's no way to convey an open file description exactly: it's a data structure inside the kernel. So the kernel represents it in an approximate way: as a symbolic link to the file. The kernel remembers the name of the file, and even keeps track of the file if it's renamed thanks to information maintained by the abstract filesystem layer. If the file is deleted, the kernel remembers the last name it knew and appends
(deleted) to the name. The string that is returned as the target of the symbolic link is generated on the fly each time a process calls
readlink on it. Under the hood, opening
/proc/<pid>/exe shortcuts the usual symbolic link resolution and directly opens the file description. The same applies to
/proc/<pid>/root and other similar links.
Another example of a “magic” symbolic link is
/proc/self. It's generated on the fly to point to the
/proc/<pid> directory of the process that accesses it.