diff --git a/libtcc.c b/libtcc.c
index bc784e7f..e7d04fed 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -1482,6 +1482,7 @@ static const FlagDef flag_defs[] = {
     { offsetof(TCCState, leading_underscore), 0, "leading-underscore" },
     { offsetof(TCCState, ms_extensions), 0, "ms-extensions" },
     { offsetof(TCCState, old_struct_init_code), 0, "old-struct-init-code" },
+    { offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" },
 };
 
 /* set/reset a flag */
diff --git a/tcc-doc.texi b/tcc-doc.texi
index 909af720..a8849f00 100644
--- a/tcc-doc.texi
+++ b/tcc-doc.texi
@@ -241,6 +241,9 @@ Allow a MS C compiler extensions to the language. Curretly this
 assume a nested named structure declaration without identifier behave
 like an unnamed one.
 
+@item -fdollars-in-identifiers
+Allow a dollars in identifiers
+
 @end table
 
 Warning options:
diff --git a/tcc.h b/tcc.h
index d61b5b72..c5678a8c 100644
--- a/tcc.h
+++ b/tcc.h
@@ -605,6 +605,7 @@ struct TCCState {
     int ms_extensions;		/* allow nested named struct w/o identifier behave like unnamed */
     int old_struct_init_code;	/* use old algorithm to init array in struct when there is no '{' used.
 				   Liuux 2.4.26 can't find initrd when compiled with a new algorithm */
+    int dollars_in_identifiers;	/* allows '$' char in indentifiers */
     
     /* warning switches */
     int warn_write_strings;
diff --git a/tccpp.c b/tccpp.c
index f38e41ad..111ea2b7 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -2286,7 +2286,10 @@ maybe_newline:
             }
         }
         break;
-
+    
+    /* treat $ as allowed char in indentifier  */
+    case '$': if (!tcc_state->dollars_in_identifiers) goto parse_simple;    
+    
     case 'a': case 'b': case 'c': case 'd':
     case 'e': case 'f': case 'g': case 'h':
     case 'i': case 'j': case 'k': case 'l':
@@ -2589,8 +2592,8 @@ maybe_newline:
     case ':':
     case '?':
     case '~':
-    case '$': /* only used in assembler */
-    case '@': /* dito */
+    case '@': /* only used in assembler */
+    parse_simple:
         tok = c;
         p++;
         break;
@@ -3174,7 +3177,8 @@ ST_FUNC void preprocess_new(void)
 
     /* init isid table */
     for(i=CH_EOF;i<256;i++)
-        isidnum_table[i-CH_EOF] = isid(i) || isnum(i);
+        isidnum_table[i-CH_EOF] = (isid(i) || isnum(i) ||
+            (tcc_state->dollars_in_identifiers ? i == '$' : 0));
 
     /* add all tokens */
     if (table_ident) {