GCC follows the Itanium ABI:
Starting with GCC 3.2, GCC binary conventions for C++ are based on a written, vendor-neutral C++ ABI that was designed to be specific to 64-bit Itanium ...
The Itanium ABI specifies different destructors:
<ctor-dtor-name> ::= C1 # complete object constructor
::= C2 # base object constructor
::= C3 # complete object allocating constructor
::= D0 # deleting destructor
::= D1 # complete object destructor
::= D2 # base object destructor
The number convention can be seen in your assembly output (the difference between the name mangling in the two functions is 0 and 1).
Finally, here's a description of the difference between these two destructors:
The entries for virtual destructors are actually pairs of entries. The
first destructor, called the complete object destructor, performs the
destruction without calling delete() on the object. The second
destructor, called the deleting destructor, calls delete() after
destroying the object. Both destroy any virtual bases; a separate,
non-virtual function, called the base object destructor, performs
destruction of the object but not its virtual base subobjects, and
does not call delete()
Further, this only happens if your class has a virtual destructor:
This ABI does not require the generation or use of allocating constructors or deleting destructors for classes without a virtual destructor. However, if an implementation emits such functions, it must use the external names specified in this ABI. If such a function has external linkage, it must be emitted wherever referenced, in a COMDAT group whose name is the external name of the function.