a2c3cb4050
This stops GCC from optimizing out a for-loop inside the dump_cv_sst_src_module() function, when tools/winedump is compiled with optimization settings -O1 or higher. Because the baseSrcLn field of the 'struct OMFSourceFile' was declared as a flexible array of one element **and it is an interior member** of the structure: typedef struct OMFSourceFile { unsigned short cSeg; unsigned short reserved; unsigned int baseSrcLn[1]; unsigned short cFName; char Name; } OMFSourceFile; The compiler/optimizer assumes that the baseSrcLn array may have only zero or one element. And generates the corresponding code. The following shows code that GCC 14.2.1 generates before and after this patch. Before patch: # this printf(3)'s "File table: ..." 524f: call 4160 <printf@plt> # r15 stores sourceFile->cSeg; assigned above. 5254: cmpw $0x0,(%r12) # r12 is sourceFile 525a: je 527e <dump_codeview+0x70e> 525c: lea 0x4(%r12,%r15,4),%rax #rax is seg_info_dw 5261: mov 0x4(%r12),%r8d # sourceFile->baseSrcLn[0] 5266: mov $0x1,%esi 526b: lea 0x402fe(%rip),%rdi # 45570 5272: mov 0x4(%rax),%ecx 5275: mov (%rax),%edx 5277: xor %eax,%eax 5279: call 4160 <printf@plt> 527e: movzbl (%r14),%eax # eax = sourceModule + ofs The code checks if the sourceFile->cSeg is zero or not, and if not it printf(3)'s information about the first element in the baseSrcLn and first offset pair. There is no for-loop there, only its first iteration. After patch: # this printf(3)'s "File table: ..." 525c: call 4160 <printf@plt> # r12 is seg_info_dw and r15 stores integer 1; both assigned above. # r15 is `i' -- the loop counter. 5261: cmpw $0x0,(%r14) # r14 is sourceFile 5266: je 529f <dump_codeview+0x72f> 5268: nopl 0x0(%rax,%rax,1) 526f: 5270: mov -0x8(%r12,%r15,8),%edx 5275: mov -0x4(%r12,%r15,8),%ecx 527a: mov %r15d,%esi 527d: xor %eax,%eax 527f: mov (%r14,%r15,4),%r8d # sourceFile->baseSrcLn[i] 5283: lea 0x402e6(%rip),%rdi # 45570 528a: add $0x1,%r15 528e: call 4160 <printf@plt> 5293: movzwl (%r14),%eax 5297: lea -0x1(%r15),%edx 529b: cmp %eax,%edx 529d: jl 5270 <dump_codeview+0x700> 529f: mov 0x18(%rsp),%rax # rax = sourceModule + ofs The for-loop now is where it should be. Signed-off-by: Ruslan Garipov <ruslanngaripov@gmail.com> |
||
---|---|---|
dlls | ||
documentation | ||
fonts | ||
include | ||
libs | ||
loader | ||
nls | ||
po | ||
programs | ||
server | ||
tools | ||
.editorconfig | ||
.gitlab-ci.yml | ||
.mailmap | ||
aclocal.m4 | ||
ANNOUNCE.md | ||
AUTHORS | ||
configure | ||
configure.ac | ||
COPYING.LIB | ||
LICENSE | ||
LICENSE.OLD | ||
MAINTAINERS | ||
README.md | ||
VERSION |
INTRODUCTION
Wine is a program which allows running Microsoft Windows programs (including DOS, Windows 3.x, Win32, and Win64 executables) on Unix. It consists of a program loader which loads and executes a Microsoft Windows binary, and a library (called Winelib) that implements Windows API calls using their Unix, X11 or Mac equivalents. The library may also be used for porting Windows code into native Unix executables.
Wine is free software, released under the GNU LGPL; see the file LICENSE for the details.
QUICK START
From the top-level directory of the Wine source (which contains this file), run:
./configure
make
Then either install Wine:
make install
Or run Wine directly from the build directory:
./wine notepad
Run programs as wine program
. For more information and problem
resolution, read the rest of this file, the Wine man page, and
especially the wealth of information found at https://www.winehq.org.
REQUIREMENTS
To compile and run Wine, you must have one of the following:
- Linux version 2.6.22 or later
- FreeBSD 12.4 or later
- Solaris x86 9 or later
- NetBSD-current
- Mac OS X 10.12 or later
As Wine requires kernel-level thread support to run, only the operating systems mentioned above are supported. Other operating systems which support kernel threads may be supported in the future.
FreeBSD info: See https://wiki.freebsd.org/Wine for more information.
Solaris info: You will most likely need to build Wine with the GNU toolchain (gcc, gas, etc.). Warning : installing gas does not ensure that it will be used by gcc. Recompiling gcc after installing gas or symlinking cc, as and ld to the gnu tools is said to be necessary.
NetBSD info: Make sure you have the USER_LDT, SYSVSHM, SYSVSEM, and SYSVMSG options turned on in your kernel.
Mac OS X info: You need Xcode/Xcode Command Line Tools or Apple cctools. The minimum requirements for compiling Wine are clang 3.8 with the MacOSX10.10.sdk and mingw-w64 v8. The MacOSX10.14.sdk and later can only build wine64.
Supported file systems: Wine should run on most file systems. A few compatibility problems have also been reported using files accessed through Samba. Also, NTFS does not provide all the file system features needed by some applications. Using a native Unix file system is recommended.
Basic requirements: You need to have the X11 development include files installed (called xorg-dev in Debian and libX11-devel in Red Hat). Of course you also need make (most likely GNU make). You also need flex version 2.5.33 or later and bison.
Optional support libraries: Configure will display notices when optional libraries are not found on your system. See https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine for hints about the packages you should install. On 64-bit platforms, you have to make sure to install the 32-bit versions of these libraries.
COMPILATION
To build Wine, do:
./configure
make
This will build the program "wine" and numerous support libraries/binaries. The program "wine" will load and run Windows executables. The library "libwine" ("Winelib") can be used to compile and link Windows source code under Unix.
To see compile configuration options, do ./configure --help
.
For more information, see https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine
SETUP
Once Wine has been built correctly, you can do make install
; this
will install the wine executable and libraries, the Wine man page, and
other needed files.
Don't forget to uninstall any conflicting previous Wine installation
first. Try either dpkg -r wine
or rpm -e wine
or make uninstall
before installing.
Once installed, you can run the winecfg
configuration tool. See the
Support area at https://www.winehq.org/ for configuration hints.
RUNNING PROGRAMS
When invoking Wine, you may specify the entire path to the executable, or a filename only.
For example, to run Notepad:
wine notepad (using the search Path as specified in
wine notepad.exe the registry to locate the file)
wine c:\\windows\\notepad.exe (using DOS filename syntax)
wine ~/.wine/drive_c/windows/notepad.exe (using Unix filename syntax)
wine notepad.exe readme.txt (calling program with parameters)
Wine is not perfect, so some programs may crash. If that happens you will get a crash log that you should attach to your report when filing a bug.
GETTING MORE INFORMATION
-
WWW: A great deal of information about Wine is available from WineHQ at https://www.winehq.org/ : various Wine Guides, application database, bug tracking. This is probably the best starting point.
-
FAQ: The Wine FAQ is located at https://gitlab.winehq.org/wine/wine/-/wikis/FAQ
-
Wiki: The Wine Wiki is located at https://gitlab.winehq.org/wine/wine/-/wikis/
-
Gitlab: Wine development is hosted at https://gitlab.winehq.org
-
Mailing lists: There are several mailing lists for Wine users and developers; see https://gitlab.winehq.org/wine/wine/-/wikis/Forums for more information.
-
Bugs: Report bugs to Wine Bugzilla at https://bugs.winehq.org Please search the bugzilla database to check whether your problem is already known or fixed before posting a bug report.
-
IRC: Online help is available at channel
#WineHQ
on irc.libera.chat.