Her C++ programında (veya kütüphanesinde veya nesne dosyasında), statik olmayan tüm işlevler ikili dosya içinde sembollerle temsil edilir. Bu semboller bir işlevin programda, kütüphanede veya nesne dosyasında tek ve diğerlerinden farklı olarak gösterildiği bir dizgedir.
C'de sembol isimleri ile işlev isimleri aynıdır: strcpy'nin sembolü de strcpy olacaktır, vb. C'de bu şekilde kullanım mümkündür çünkü statik olmayan aynı isimli iki işlev yoktur.
C++ aşırı yüklemeye (farklı işlevlerin değişik argümanlarla aynı isme sahip olması) izin verdiği için ve C'nin izin vermediği bir çok özelliği olduğu için -sınıflar, eleman işlevler, istisnai durum belirtimleri gibi- işlev isimlerini basitçe sembol ismi olarak kullanmak mümkün değildir. Bunu çözmek için C++ isim cendereleme denen, işlev isimlerinin ve tüm gerekli bilgilerin (argümanların sayısı ve boyutu gibi) sadece derleyicinin bildiği bazı garip görünümlü dizgelere dönüştürüldüğü yöntemi kullanır. Örneğin cenderelenen foo ismi foo@4%6^ gibi gözükebilir. Hatta "foo" kelimesini bile içermeyebilir.
Cendereleme ile ilgili başka bir sorun da C++ standardının (şu anda [ISO14882]) isimlerin nasıl cendereleneceğini tanımlamamasıdır. Bu yüzden her derleyici cendereleme işlemini kendine göre yapar. Hatta bazı derleyicilerin farklı sürümleri arasında bile isim cendereleme algoritmaları değişiklik göstermektedir (özellikle g++2.x ve 3.x). Belirli bir derleyicinin isim cendereleme işlemini nasıl yaptığını çözseniz bile (ve böylece işlevleri dlsym ile yükleyebilirsiniz) bu muhtemelen sadece sizin derleyicinizde çalışacak ve bir sonraki sürüme uymayacaktır.