Symbolic programming is about manipulating symbolic structures, usually representing formulas, and computing consequences. Mathematica manipulates math formulas by using rewriting techniques to help people gain insight into their meaning. Prolog uses backward chaining to find consequences. Constraint systems solves sets of constraints for answers.
These systems tend to mix rewriting, theorem proving, constraint propagation, pattern matching and forward/backward inference to achieve the desired effect.
I think of metaprogramming as a special kind of symbolic programming, in which the symbolic structures represents facts about or pieces of (including entire) programs. One of most general metaprogramming techniques is program transformation, providing the ability to manipulate program source in roughly the same way as mathematics enables one to manipulate math formulas.
As a practical matter, metaprogramming can use all the techniques of symbolic programming. It also uses lots of specific algorithms which most people consider to be compiling (e.g., data flow analysis) but is really computing with facts encoded efficiently, so for me most compiling is symbolic computing.