https://sourceware.org/bugzilla/show_bug.cgi?id=27843
Bug ID: 27843 Summary: windres quoting of backslashes and double quotes is lacking Product: binutils Version: unspecified Status: UNCONFIRMED Severity: normal Priority: P2 Component: binutils Assignee: unassigned at sourceware dot org Reporter: martin at martin dot st Target Milestone: --- Given a rc file like this: $ cat test.rc STRINGTABLE { 1 STRING } Normally, if one were to provide the definition of STRING via a command line option when preprocessing C, one would specify it as -DSTRING=\"foo\" on the command line, so that the tool receives the argument as -DSTRING="foo", and substitutes "foo". So far, across all versions (modern at least) of windres, the quotes aren't re-escaped properly. So currently, the only way of getting this to work is to double escape the backslashes, into this form, that works on both unix and windows: $ x86_64-w64-mingw32-windres test.rc test.res -DSTRING=\\\"foo\\\" -v Using `x86_64-w64-mingw32-gcc -E -xc -DRC_INVOKED -DSTRING=\"foo\" test.rc' Currently (after cc3edc52747fd8b184ee48f1b0cc1ac0aca7832e, up until the revert mishap in the current master version) it actually does work without double escaping (on windows only), if the string otherwise happens to contain a space: > windres.exe test.rc test.res "-DSTRING=\"fo o\"" -v Using `mingw64\bin\gcc -E -xc -DRC_INVOKED -D"STRING=\"fo o\"" test.rc' But without a space: > windres.exe test.rc test.res -DSTRING=\"foo\" -v Using `mingw64\bin\gcc -E -xc -DRC_INVOKED -DSTRING="foo" test.rc' Using popen to read preprocessor output windres.exe: test.rc:2: syntax error So double quotes need to be escaped, on all platforms, even if the string doesn't contain spaces. Fixing this is going to break GNU libiconv, which contains a script for doing double escaping of arguments to windres: https://git.savannah.gnu.org/gitweb/?p=libiconv.git;a=blob;f=windows/windres-options;h=779fddec305d1e78f1e5c3123683b3c380e4a82e;hb=4b1a76b8e7f718fb23eb1a48cd1be208cfff6c2a And the script is unconditionally called with the --escape option for enabling the escaping: https://git.savannah.gnu.org/gitweb/?p=libiconv.git;a=blob;f=src/Makefile.in;h=7035316ae52a38fd7515e065a63a5c14ee7f4efb;hb=4b1a76b8e7f718fb23eb1a48cd1be208cfff6c2a#l87 If this is fixed, I don't offhand see a god way of fixing iconv to be buildable both with old and new versions of windres at the same time, short of either trying both quoting forms or just rewriting the use of those macros to avoid needing to pass quoted strings on the command line. Additionally, once the quotes are escaped/quoted properly, other tricky strings that may need more work for quoting (with different quoting styles for windows and unix) are strings that contain single or double backslashes (not directly before a double quote). (I don't believe there's real use of this in the wild, but would be good to handle correctly for consistency.) -- You are receiving this mail because: You are on the CC list for the bug.