When a program is compiled, variable names are replaced by their (virtual) addresses. The names aren't necessary for the program to run, but they are essential for debugging. So the compiler stores them and their corresponding addresses in the symbol table.
This also applies to shared libraries. Imagine that I have a library (we'll call it libfoo.so) and I am writing a program that dynamically links with it. Suppose that my program wants to call the bar() function defined in libfoo.so. The linker needs to know where the bar() function is actually defined inside libfoo.so. So the symbol table maps the "bar" symbol to some address.
The way that a modern program might work, then, would be that the first time my program calls the bar() function, it actually jumps to a fake address inside of ld.so (a shared library that acts as the linker). At this point, ld.so looks at the symbol tables of the libraries that I've linked with, finds the bar() function, and replaces the fake address with the actual address. Then, in the future, my program will go to bar() directly, and not go through ld.so.
So it would seem that "symbol" is used as a synonym for the name of a variable function or types. I did eventually find this web page that has an indirect definition on "symbol". As far as term usage I would say that this one is one of the most elusive to find and I image symbol was used because aliases was already taken , still absurd though. A word is not a symbol. Word !=Symbol.
Yeah. You got two great answers from Hazel and Cabhan. A symbol is related to some address, either variable or function or other discrete chunk of memory in the program, such as string literals and whatnot.