Patch set from Bin Meng to clean up some code & support building sgdisk for Windows

This commit is contained in:
Rod Smith
2022-04-10 09:28:08 -04:00
parent fd60f74362
commit edc67b66db
25 changed files with 226 additions and 205 deletions

View File

@@ -1,7 +1,7 @@
CFLAGS+=-D_FILE_OFFSET_BITS=64
#CXXFLAGS+=-Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16
CXXFLAGS+=-Wall -D_FILE_OFFSET_BITS=64
#CXXFLAGS+=-O2 -Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16
CXXFLAGS+=-O2 -Wall -D_FILE_OFFSET_BITS=64
LDFLAGS+=
LDLIBS+=-luuid #-licuio -licuuc
LIB_NAMES=crc32 support guid gptpart mbrpart basicmbr mbr gpt bsd parttypes attributes diskio diskio-unix
MBR_LIBS=support diskio diskio-unix basicmbr mbrpart
LIB_OBJS=$(LIB_NAMES:=.o)
@@ -12,19 +12,16 @@ DEPEND= makedepend $(CXXFLAGS)
all: cgdisk gdisk sgdisk fixparts
gdisk: $(LIB_OBJS) gdisk.o gpttext.o
$(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -luuid $(LDLIBS) -o gdisk
# $(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -licuio -licuuc -luuid -o gdisk
$(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) $(LDLIBS) -o gdisk
cgdisk: $(LIB_OBJS) cgdisk.o gptcurses.o
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) -luuid -lncursesw $(LDLIBS) -o cgdisk
# $(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) -licuio -licuuc -luuid -lncurses -o cgdisk
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) $(LDLIBS) -lncursesw -o cgdisk
sgdisk: $(LIB_OBJS) sgdisk.o gptcl.o
$(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) -luuid -lpopt $(LDLIBS) -o sgdisk
# $(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) -licuio -licuuc -luuid -lpopt -o sgdisk
$(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) $(LDLIBS) -lpopt -o sgdisk
fixparts: $(MBR_LIB_OBJS) fixparts.o
$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) $(LDLIBS) -o fixparts
$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -o fixparts
test:
./gdisk_test.sh

View File

@@ -1,9 +1,8 @@
CC=clang
CXX=clang++
CFLAGS+=-D_FILE_OFFSET_BITS=64
#CXXFLAGS+=-Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16 -I/usr/local/include
CXXFLAGS+=-Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include
LDFLAGS+=
#CXXFLAGS+=-O2 -Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16 -I/usr/local/include
CXXFLAGS+=-O2 -Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include
LDFLAGS+=-L/usr/local/lib
LDLIBS+=-luuid #-licuio
LIB_NAMES=crc32 support guid gptpart mbrpart basicmbr mbr gpt bsd parttypes attributes diskio diskio-unix
MBR_LIBS=support diskio diskio-unix basicmbr mbrpart
LIB_OBJS=$(LIB_NAMES:=.o)
@@ -14,25 +13,22 @@ DEPEND= makedepend $(CXXFLAGS)
all: gdisk cgdisk sgdisk fixparts
gdisk: $(LIB_OBJS) gdisk.o gpttext.o
# $(CXX) $(LIB_OBJS) gdisk.o gpttext.o -L/usr/local/lib $(LDFLAGS) -licuio -luuid -o gdisk
$(CXX) $(LIB_OBJS) gdisk.o gpttext.o -L/usr/local/lib $(LDFLAGS) -luuid -o gdisk
$(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) $(LDLIBS) -o gdisk
cgdisk: $(LIB_OBJS) cgdisk.o gptcurses.o
# $(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o -L/usr/local/lib $(LDFLAGS) -licuio -luuid -lncurses -o cgdisk
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o -L/usr/local/lib $(LDFLAGS) -luuid -lncurses -o cgdisk
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) $(LDLIBS) -lncurses -o cgdisk
sgdisk: $(LIB_OBJS) sgdisk.o gptcl.o
# $(CXX) $(LIB_OBJS) sgdisk.o gptcl.o -L/usr/local/lib $(LDFLAGS) -luuid -licuio -lpopt -o sgdisk
$(CXX) $(LIB_OBJS) sgdisk.o gptcl.o -L/usr/local/lib $(LDFLAGS) -luuid -lpopt -o sgdisk
$(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) $(LDLIBS) -lpopt -o sgdisk
fixparts: $(MBR_LIB_OBJS) fixparts.o
$(CXX) $(MBR_LIB_OBJS) fixparts.o -L/usr/local/lib $(LDFLAGS) -o fixparts
$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -o fixparts
lint: #no pre-reqs
lint $(SRCS)
clean: #no pre-reqs
rm -f core *.o *~ gdisk sgdisk
rm -f core *.o *~ gdisk cgdisk sgdisk fixparts
# what are the source dependencies
depend: $(SRCS)

View File

@@ -1,11 +1,11 @@
CC=gcc
CXX=c++
# FATBINFLAGS=-arch x86_64 -arch i386 -mmacosx-version-min=10.9
FATBINFLAGS=-arch x86_64 -arch arm64 -mmacosx-version-min=10.9
THINBINFLAGS=-arch x86_64 -mmacosx-version-min=10.9
CFLAGS=$(FATBINFLAGS) -O2 -D_FILE_OFFSET_BITS=64 -g
#CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16 -I/opt/local/include -I/usr/local/include -I/opt/local/include -g
CXXFLAGS=$(FATBINFLAGS) -O2 -Wall -D_FILE_OFFSET_BITS=64 -stdlib=libc++ -I/opt/local/include -I /usr/local/include -I/opt/local/include -g
#CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -D USE_UTF16 -I/opt/local/include -I/usr/local/include -I/opt/local/include
CXXFLAGS=$(FATBINFLAGS) -O2 -Wall -D_FILE_OFFSET_BITS=64 -stdlib=libc++ -I/opt/local/include -I /usr/local/include -I/opt/local/include
LDFLAGS+=
LDLIBS+= #-licucore
LIB_NAMES=crc32 support guid gptpart mbrpart basicmbr mbr gpt bsd parttypes attributes diskio diskio-unix
MBR_LIBS=support diskio diskio-unix basicmbr mbrpart
#LIB_SRCS=$(NAMES:=.cc)
@@ -17,25 +17,17 @@ DEPEND= makedepend $(CFLAGS)
all: gdisk sgdisk cgdisk fixparts
gdisk: $(LIB_OBJS) gpttext.o gdisk.o
$(CXX) $(LIB_OBJS) gpttext.o gdisk.o $(FATBINFLAGS) -o gdisk
# $(CXX) $(LIB_OBJS) -L/usr/lib -licucore gpttext.o gdisk.o -o gdisk
$(CXX) $(LIB_OBJS) gpttext.o gdisk.o $(FATBINFLAGS) $(LDFLAGS) $(LDLIBS) -o gdisk
cgdisk: $(LIB_OBJS) cgdisk.o gptcurses.o
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o /usr/local/Cellar/ncurses/6.2/lib/libncurses.dylib $(LDFLAGS) -o cgdisk
# $(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o /usr/lib/libncurses.dylib $(LDFLAGS) -o cgdisk
# $(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) -licucore -lncurses -o cgdisk
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) $(LDLIBS) /usr/local/Cellar/ncurses/6.2/lib/libncurses.dylib -o cgdisk
sgdisk: $(LIB_OBJS) gptcl.o sgdisk.o
# $(CXX) $(LIB_OBJS) gptcl.o sgdisk.o /opt/local/lib/libiconv.a /opt/local/lib/libintl.a /opt/local/lib/libpopt.a $(FATBINFLAGS) -o sgdisk
$(CXX) $(LIB_OBJS) gptcl.o sgdisk.o -L/usr/local/lib -lpopt $(THINBINFLAGS) -o sgdisk
# $(CXX) $(LIB_OBJS) gptcl.o sgdisk.o -L/sw/lib -licucore -lpopt -o sgdisk
$(CXX) $(LIB_OBJS) gptcl.o sgdisk.o $(LDFLAGS) -L/usr/local/lib $(LDLIBS) -lpopt $(THINBINFLAGS) -o sgdisk
fixparts: $(MBR_LIB_OBJS) fixparts.o
$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) $(FATBINFLAGS) -o fixparts
testguid: $(LIB_OBJS) testguid.o
$(CXX) $(LIB_OBJS) testguid.o -o testguid
lint: #no pre-reqs
lint $(SRCS)

View File

@@ -1,9 +1,9 @@
CC=/usr/bin/i686-w64-mingw32-gcc
CXX=/usr/bin/i686-w64-mingw32-g++
STRIP=/usr/bin/i686-w64-mingw32-strip
CFLAGS=-O2 -Wall -static -static-libgcc -static-libstdc++ -D_FILE_OFFSET_BITS=64 -g
CXXFLAGS=-O2 -Wall -static -static-libgcc -static-libstdc++ -D_FILE_OFFSET_BITS=64 -g
#CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include -I/opt/local/include -g
CXX=i686-w64-mingw32-g++
STRIP=i686-w64-mingw32-strip
CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -static -static-libgcc -static-libstdc++
#CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include -I/opt/local/include
LDFLAGS+=-static -static-libgcc -static-libstdc++
LDLIBS+=-lrpcrt4
LIB_NAMES=guid gptpart bsd parttypes attributes crc32 mbrpart basicmbr mbr gpt support diskio diskio-windows
MBR_LIBS=support diskio diskio-windows basicmbr mbrpart
LIB_SRCS=$(NAMES:=.cc)
@@ -12,25 +12,28 @@ MBR_LIB_OBJS=$(MBR_LIBS:=.o)
LIB_HEADERS=$(LIB_NAMES:=.h)
DEPEND= makedepend $(CFLAGS)
all: gdisk fixparts
all: gdisk sgdisk fixparts
gdisk: $(LIB_OBJS) gdisk.o gpttext.o
$(CXX) $(CXXFLAGS) $(LIB_OBJS) gdisk.o gpttext.o -lrpcrt4 -static-libgcc -o gdisk32.exe
$(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) $(LDLIBS) -o gdisk32.exe
sgdisk: $(LIB_OBJS) sgdisk.o
$(CXX) $(CXXFLAGS) $(LIB_OBJS) sgdisk.o -lpopt -static-libgcc -o sgdisk32.exe
cgdisk: $(LIB_OBJS) cgdisk.o gptcurses.o
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) $(LDLIBS) -lncursesw -o cgdisk32.exe
sgdisk: $(LIB_OBJS) sgdisk.o gptcl.o
$(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) $(LDLIBS) -lpopt -lintl -liconv -o sgdisk32.exe
fixparts: $(MBR_LIB_OBJS) fixparts.o
$(CXX) $(CXXFLAGS) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -static-libgcc -o fixparts32.exe
$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -o fixparts32.exe
lint: #no pre-reqs
lint $(SRCS)
clean: #no pre-reqs
rm -f core *.o *~ gdisk.exe sgdisk.exe
rm -f core *.o *~ gdisk32.exe cgdisk32.exe sgdisk32.exe fixparts32.exe
strip: #no pre-reqs
$(STRIP) gdisk32.exe fixparts32.exe
$(STRIP) gdisk32.exe cgdisk32.exe sgdisk32.exe fixparts32.exe
# what are the source dependencies
depend: $(SRCS)

View File

@@ -1,9 +1,9 @@
CC=/usr/bin/x86_64-w64-mingw32-gcc
CXX=/usr/bin/x86_64-w64-mingw32-g++
STRIP=/usr/bin/x86_64-w64-mingw32-strip
CFLAGS=-O2 -Wall -static -static-libgcc -static-libstdc++ -D_FILE_OFFSET_BITS=64 -g
CXXFLAGS=-O2 -Wall -static -static-libgcc -static-libstdc++ -D_FILE_OFFSET_BITS=64 -g
CXX=x86_64-w64-mingw32-g++
STRIP=x86_64-w64-mingw32-strip
CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -g
#CXXFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -I /usr/local/include -I/opt/local/include -g
LDFLAGS+=-static -static-libgcc -static-libstdc++
LDLIBS+=-lrpcrt4
LIB_NAMES=guid gptpart bsd parttypes attributes crc32 mbrpart basicmbr mbr gpt support diskio diskio-windows
MBR_LIBS=support diskio diskio-windows basicmbr mbrpart
LIB_SRCS=$(NAMES:=.cc)
@@ -12,25 +12,29 @@ MBR_LIB_OBJS=$(MBR_LIBS:=.o)
LIB_HEADERS=$(LIB_NAMES:=.h)
DEPEND= makedepend $(CFLAGS)
all: gdisk fixparts
# Note: cgdisk is buildable in Windows, but not in Ubuntu 20.04 or 22.04
all: gdisk sgdisk fixparts
gdisk: $(LIB_OBJS) gdisk.o gpttext.o
$(CXX) $(CXXFLAGS) $(LIB_OBJS) gdisk.o gpttext.o -lrpcrt4 -static-libgcc -o gdisk64.exe
$(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) $(LDLIBS) -o gdisk64.exe
sgdisk: $(LIB_OBJS) sgdisk.o
$(CXX) $(CXXFLAGS) $(LIB_OBJS) sgdisk.o -lpopt -static-libgcc -o sgdisk64.exe
cgdisk: $(LIB_OBJS) cgdisk.o gptcurses.o
$(CXX) $(LIB_OBJS) cgdisk.o gptcurses.o $(LDFLAGS) $(LDLIBS) -lncursesw -o cgdisk64.exe
sgdisk: $(LIB_OBJS) sgdisk.o gptcl.o
$(CXX) $(LIB_OBJS) sgdisk.o gptcl.o $(LDFLAGS) $(LDLIBS) -lpopt -lintl -liconv -o sgdisk64.exe
fixparts: $(MBR_LIB_OBJS) fixparts.o
$(CXX) $(CXXFLAGS) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -static-libgcc -o fixparts64.exe
$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -o fixparts64.exe
lint: #no pre-reqs
lint $(SRCS)
clean: #no pre-reqs
rm -f core *.o *~ gdisk64.exe sgdisk64.exe
rm -f core *.o *~ gdisk64.exe cgdisk64.exe sgdisk64.exe fixparts64.exe
strip: #no pre-reqs
$(STRIP) gdisk64.exe fixparts64.exe
$(STRIP) gdisk64.exe cgdisk64.exe sgdisk64.exe fixparts64.exe
# what are the source dependencies
depend: $(SRCS)

View File

@@ -28,12 +28,8 @@ Windows Use Notes
The Windows version of GPT fdisk was added with version 0.6.2 of the
package. The Windows binary package includes the gdisk.exe interactive
text-mode program file but no equivalent to the sgdisk program that's
available with Linux, FreeBSD, and OS X builds. In theory, an sgdisk.exe
for Windows could be built if the popt library were installed. I've not
attempted to do this myself, though. If you care to try, check
http://gnuwin32.sourceforge.net/packages/popt.htm for information on popt
for Windows.
text-mode program file as well as the sgdisk program that's available
with Linux, FreeBSD, and OS X builds.
Beginning with version 0.8.10, I'm distributing both 32-bit and 64-bit
binaries, which include the strings "32" or "64" in their names. The 32-bit
@@ -47,10 +43,11 @@ certain partition table problems that can be created by buggy partitioning
software. Windows seems to be unfazed by most such problems, but I've not
done an extensive survey of Windows partitioning tools on this score.
To install the programs, copy the gdisk32.exe and fixparts32.exe (or
gdisk64.exe and fixparts64.exe) program files to any directory on your
path, such as C:\Windows. Alternatively, you can change to the program's
directory or type its complete path whenever you use it.
To install the programs, copy the gdisk32.exe, cgdisk32.exe, sgdisk32.exe
and fixparts32.exe (or gdisk64.exe, cgdisk64.exe, sgdisk64.exe and
fixparts64.exe) program files to any directory on your path, such as
C:\Windows. Alternatively, you can change to the program's directory or type
its complete path whenever you use it.
To use the programs, first launch a Command Prompt as the Administrator. To
do this, locate the Command Prompt program icon, right-click it, and select
@@ -74,17 +71,18 @@ This command is equivalent to the earlier one -- it edits the partition
table on the first physical disk. Change the number at the end of the
device name to change the disk edited.
If you pass the "-l" option to gdisk.exe in addition to the disk
identifier, the program displays the current partition table information
and then exits. This use entails no risk to MBR disks, since the program
never writes data back to the disk when used in this way.
If you pass the "-l" option to gdisk64.exe in addition to the disk
identifier, the program displays the current partition table information and
then exits. (Alternatively, you can pass "-p" to sgdisk64.exe.) This use
entails no risk to MBR disks, since the program never writes data back to
the disk when used in this way.
As noted above, editing the first disk with GPT fdisk is usually a Bad
Idea. An exception would be if your system uses an Extensible Firmware
Interface (EFI) and already boots from a GPT disk. It's safer to edit
non-boot disks, which usually have numbers of 1 and above, but only if you
run a version of Windows with GPT support. For more information on Windows'
support of GPT, see Microsoft's Web page on the topic:
As noted above, editing the first disk with GPT fdisk is a Bad Idea on older
BIOS-based computers. Newer computers typically use an Extensible Firmware
Interface (EFI) and boot from GPT disks. It's safer to edit non-boot disks,
which usually have numbers of 1 and above, but only if you run a version of
Windows with GPT support. For more information on Windows' support of GPT,
see Microsoft's Web page on the topic:
http://www.microsoft.com/whdc/device/storage/GPT_FAQ.mspx
@@ -103,34 +101,91 @@ Source Code and Compilation Issues
I have successfully compiled GPT fdisk using three different Windows
compilers:
- MinGW (http://www.mingw.org), and in particular its Linux-hosted
cross-compiler -- Under Ubuntu Linux, the Makefile.mingw and
Makefile.mingw64 files enable compilation of the software via MinGW.
(Type "make -f Makefile.mingw" to compile 32-bit binaries, and "make -f
Makefile.mingw64" to compile 64-bit binaries.) If you try to compile
using another compiler or even using MinGW under Windows or another Linux
variety, you may need to adjust the Makefile.mingw options.
- MinGW (https://www.mingw-w64.org/), using either a Linux-hosted
cross-compiler or under Windows using the original MinGW or MSYS2
(https://www.msys2.org). This is my only GPT fdisk development environment
for Windows in 2022.
- Microsoft Visual C++ 2008 Express
(http://www.microsoft.com/express/Windows/) -- This compiler requires a
third-party stdint.h file (I used the one from
http://msinttypes.googlecode.com/svn/trunk/stdint.h), but it otherwise
works fine. A project is easily created by adding all the *.h files and
all the *.cc files except diskio-unix.cc, sgdisk.cc, and whichever
program file you intend to NOT build (gdisk.cc or fixparts.cc).
http://web.archive.org/web/20130317001712/http://msinttypes.googlecode.com/svn/trunk/stdint.h),
but it otherwise worked fine the last time I tried it. A project is easily
created by adding all the *.h files and all the *.cc files except
diskio-unix.cc, sgdisk.cc, and whichever program file you intend to NOT
build (gdisk.cc or fixparts.cc).
- Microsoft Visual C++ 2010 Express -- This compiler works much like the
2008 version, although I didn't need to add a third-party stdint.h file.
The MinGW compiler produces much larger executables than do the MS
compilers. The resulting binaries seem to work equally well, but my testing
has been minimal.
I've also attempted to compile the code with OpenWatcom 1.8, but this
attempt failed, mostly because the compiler can't yet handle iostream
output on standard C++ strings. OpenWatcom also seems to have incorrectly
set the value of UINT32_MAX as if uint32_t values were 64-bit integers.
This alone won't cause the compile to fail, but it would create bugs.
Although I used Microsoft Visual C++ in the past, I haven't tried using
these compilers recently and so I can't promise they would work today (in
2022).
If you modify GPT fdisk to get it to compile under another compiler, I
welcome submission of patches.
The following instructions focus on use of MinGW to compile GPT fdisk for
Windows.
My primary development environment is Ubuntu Linux, using the MinGW
cross-compiler. This system can compile the gdisk and fixparts binaries with
no need for additional libraries; after installing MinGW (via the
g++-mingw-w64 package in Ubuntu, or the equivalent in another distribution),
you can type "make -f Makefile.mingw" to compile 32-bit binaries, and "make
-f Makefile.mingw64" to compile 64-bit binaries.
If you use Windows, your best bet is likely to be to install the MSYS2
package (https://www.msys2.org). This package provides MinGW and a package
management system based on pacman (used by Arch Linux) for installing
additional libraries. To install the libraries needed to compile sgdisk and
cgdisk, type "pacman -S mingw-w64-x86_64-popt mingw-w64-x86_64-gettext
mingw-w64-x86_64-ncurses" if you want to compile 64-bit binaries; change
'x86_64' to 'i686' for 32-bit packages. This command will install the popt
library needed by sgdisk and the ncurses library needed by cgdisk, along
with gettext, which is needed by popt. With these libraries installed, you
should be able to compile all four Linux programs -- gdisk, cgdisk, sgdisk,
and fixparts.
If you want to compile sgdisk for Windows under Linux, you can do so;
however, you must copy the relevant header and library files from a Windows
installation to Linux. Specifically, you must copy:
Windows File Linux Directory
------------ ---------------
/mingw64/include/popt.h /usr/x86_64-w64-mingw32/include/
/mingw64/lib/libpopt.a /usr/x86_64-w64-mingw32/lib/
/mingw64/lib/libintl.a /usr/x86_64-w64-mingw32/lib/
/mingw64/lib/libiconv.a /usr/x86_64-w64-mingw32/lib/
For 32-bit binaries, change /mingw64 to /mingw32 on the Windows source and
x86_64-w64-mingw32 to i686-w64-mingw32 on the Linux destination.
In theory, you should be able to do something similar to compile cgdisk. The
relevant files are:
Windows File Linux Directory
------------ ---------------
/mingw64/include/ncursesw/curses.h /usr/x86_64-w64-mingw32/include/ncursesw/
/mingw64/include/ncursesw/ncurses.h /usr/x86_64-w64-mingw32/include/ncursesw/
/mingw64/include/ncursesw/ncurses_dll.h /usr/x86_64-w64-mingw32/include/ncursesw/
/mingw64/include/ncursesw/unctrl.h /usr/x86_64-w64-mingw32/include/ncursesw/
/mingw64/lib/libncurses.a /usr/x86_64-w64-mingw32/lib/
In practice, this has not worked for me; the compilation fails with a
complaint about an undefined reference to 'nanosleep'. My guess is that the
ncurses version installed in Windows is too new to work with the MinGW
libraries in Ubuntu (20.04 or 22.04). It's conceivable it would work with
another distribution, though.
In any event, the Makefile.mingw and Makefile.mingw64 files contain targets
for all four programs; however, because of the problem building cgdisk in
Linux, that program is omitted from the "all" target. It can still be built
explicitly, though, as in:
make -f Makefile.mingw64 cgdisk
The Makefiles are configured to create statically-linked binaries so as to
simplify installation of the binaries. If you want smaller binaries, you can
remove the various static options from the relevant Makefile. You can also
strip the binaries ("make -f Makefile.mingw64 strip") to remove unused code.

View File

@@ -10,11 +10,9 @@
#define NUM_ATR 64 /* # of attributes -- 64, since it's a 64-bit field */
#define ATR_NAME_SIZE 25 /* maximum size of attribute names */
using namespace std;
class Attributes {
protected:
static string atNames[NUM_ATR];
static std::string atNames[NUM_ATR];
static int numAttrs;
void Setup(void);
uint64_t attributes;
@@ -30,12 +28,12 @@ public:
void ShowAttributes(const uint32_t partNum);
void ChangeAttributes(void);
bool OperateOnAttributes(const uint32_t partNum, const string& attributeOperator, const string& attributeBits);
bool OperateOnAttributes(const uint32_t partNum, const std::string& attributeOperator, const std::string& attributeBits);
static const string& GetAttributeName(const uint32_t bitNum) {return atNames [bitNum];}
static const std::string& GetAttributeName(const uint32_t bitNum) {return atNames [bitNum];}
static void ListAttributes(void);
}; // class Attributes
ostream & operator<<(ostream & os, const Attributes & data);
std::ostream & operator<<(std::ostream & os, const Attributes & data);
#endif

View File

@@ -16,8 +16,6 @@
// Maximum number of MBR partitions
#define MAX_MBR_PARTS 128
using namespace std;
/****************************************
* *
* MBRData class and related structures *
@@ -57,23 +55,23 @@ protected:
uint32_t numSecspTrack; // number of sectors per track, in CHS scheme
DiskIO* myDisk;
int canDeleteMyDisk;
string device;
std::string device;
MBRValidity state;
MBRPart* GetPartition(int i); // Return primary or logical partition
public:
BasicMBRData(void);
BasicMBRData(string deviceFilename);
BasicMBRData(std::string deviceFilename);
BasicMBRData(const BasicMBRData &);
~BasicMBRData(void);
BasicMBRData & operator=(const BasicMBRData & orig);
// File I/O functions...
int ReadMBRData(const string & deviceFilename);
int ReadMBRData(const std::string & deviceFilename);
int ReadMBRData(DiskIO * theDisk, int checkBlockSize = 1);
int ReadLogicalParts(uint64_t extendedStart, int partNum);
int WriteMBRData(void);
int WriteMBRData(DiskIO *theDisk);
int WriteMBRData(const string & deviceFilename);
int WriteMBRData(const std::string & deviceFilename);
int WriteMBRData(struct TempMBR & mbr, DiskIO *theDisk, uint64_t sector);
void DiskSync(void) {myDisk->DiskSync();}
void SetDisk(DiskIO *theDisk);
@@ -147,7 +145,7 @@ public:
uint64_t GetLength(int i);
// User interaction functions....
int DoMenu(const string& prompt = "\nMBR command (? for help): ");
int DoMenu(const std::string& prompt = "\nMBR command (? for help): ");
void ShowCommands(void);
}; // class BasicMBRData

5
bsd.h
View File

@@ -30,9 +30,6 @@
// memory errors will occur.
#define MAX_BSD_PARTS 64
using namespace std;
/****************************************
* *
* BSDData class and related structures *
@@ -75,7 +72,7 @@ class BSDData {
public:
BSDData(void);
~BSDData(void);
int ReadBSDData(const string & deviceFilename, uint64_t startSector, uint64_t endSector);
int ReadBSDData(const std::string & deviceFilename, uint64_t startSector, uint64_t endSector);
int ReadBSDData(DiskIO *myDisk, uint64_t startSector, uint64_t endSector);
void ReverseMetaBytes(void);
void DisplayBSDData(void);

View File

@@ -31,7 +31,7 @@ uint32_t crc_tab[256];
*/
uint32_t chksum_crc32 (unsigned char *block, unsigned int length)
{
register unsigned long crc;
unsigned long crc;
unsigned long i;
crc = 0xFFFFFFFF;

View File

@@ -37,8 +37,6 @@
#include "support.h"
//#include "parttypes.h"
using namespace std;
/***************************************
* *
* DiskIO class and related structures *
@@ -47,9 +45,9 @@ using namespace std;
class DiskIO {
protected:
string userFilename;
string realFilename;
string modelName;
std::string userFilename;
std::string realFilename;
std::string modelName;
int isOpen;
int openForWrite;
#ifdef _WIN32
@@ -62,9 +60,9 @@ class DiskIO {
~DiskIO(void);
void MakeRealName(void);
int OpenForRead(const string & filename);
int OpenForRead(const std::string & filename);
int OpenForRead(void);
int OpenForWrite(const string & filename);
int OpenForWrite(const std::string & filename);
int OpenForWrite(void);
void Close();
int Seek(uint64_t sector);
@@ -73,12 +71,12 @@ class DiskIO {
int DiskSync(void); // resync disk caches to use new partitions
int GetBlockSize(void);
int GetPhysBlockSize(void);
string GetModel(void) {return modelName;}
std::string GetModel(void) {return modelName;}
uint32_t GetNumHeads(void);
uint32_t GetNumSecsPerTrack(void);
int IsOpen(void) {return isOpen;}
int IsOpenForWrite(void) {return openForWrite;}
string GetName(void) const {return realFilename;}
std::string GetName(void) const {return realFilename;}
uint64_t DiskSize(int* err);
}; // class DiskIO

View File

@@ -11,6 +11,8 @@
#include <iostream>
#include "gpttext.h"
using namespace std;
int main(int argc, char* argv[]) {
GPTDataTextUI theGPT;
string device = "";

20
gpt.h
View File

@@ -24,8 +24,6 @@
// smallest Advanced Format drive I know of is 320GB in size
#define SMALLEST_ADVANCED_FORMAT UINT64_C(585937500)
using namespace std;
/****************************************
* *
* GPTData class and related structures *
@@ -67,7 +65,7 @@ protected:
uint32_t numParts; // # of partitions the table can hold
struct GPTHeader secondHeader;
MBRData protectiveMBR;
string device; // device filename
std::string device; // device filename
DiskIO myDisk;
uint32_t blockSize; // device logical block size
uint32_t physBlockSize; // device physical block size (or 0 if it can't be determined)
@@ -93,7 +91,7 @@ public:
// Basic necessary functions....
GPTData(void);
GPTData(const GPTData &);
GPTData(string deviceFilename);
GPTData(std::string deviceFilename);
virtual ~GPTData(void);
GPTData & operator=(const GPTData & orig);
@@ -111,18 +109,18 @@ public:
int FindInsanePartitions(void);
// Load or save data from/to disk
int SetDisk(const string & deviceFilename);
int SetDisk(const std::string & deviceFilename);
DiskIO* GetDisk(void) {return &myDisk;}
int LoadMBR(const string & f) {return protectiveMBR.ReadMBRData(f);}
int LoadMBR(const std::string & f) {return protectiveMBR.ReadMBRData(f);}
int WriteProtectiveMBR(void) {return protectiveMBR.WriteMBRData(&myDisk);}
void PartitionScan(void);
int LoadPartitions(const string & deviceFilename);
int LoadPartitions(const std::string & deviceFilename);
int ForceLoadGPTData(void);
int LoadMainTable(void);
int LoadSecondTableAsMain(void);
int SaveGPTData(int quiet = 0);
int SaveGPTBackup(const string & filename);
int LoadGPTBackup(const string & filename);
int SaveGPTBackup(const std::string & filename);
int LoadGPTBackup(const std::string & filename);
int SaveMBR(void);
int DestroyGPT(void);
int DestroyMBR(void);
@@ -204,9 +202,9 @@ public:
void ReversePartitionBytes(); // for endianness
// Attributes functions
int ManageAttributes(int partNum, const string & command, const string & bits);
int ManageAttributes(int partNum, const std::string & command, const std::string & bits);
void ShowAttributes(const uint32_t partNum);
void GetAttribute(const uint32_t partNum, const string& attributeBits);
void GetAttribute(const uint32_t partNum, const std::string& attributeBits);
}; // class GPTData

View File

@@ -26,6 +26,8 @@
#include <popt.h>
#include "gptcl.h"
using namespace std;
GPTDataCL::GPTDataCL(void) {
attributeOperation = backupFile = partName = hybrids = newPartInfo = NULL;
mbrParts = twoParts = outDevice = typeCode = partGUID = diskGUID = NULL;
@@ -504,7 +506,7 @@ int GPTDataCL::DoOptions(int argc, char* argv[]) {
// Create a hybrid or regular MBR from GPT data structures
int GPTDataCL::BuildMBR(char* argument, int isHybrid) {
int numParts, allOK = 1, i, origPartNum;
int eeLast, mbrNum = 0;
int eeLast = 0, mbrNum = 0;
MBRPart newPart;
BasicMBRData newMBR;

10
gptcl.h
View File

@@ -25,8 +25,6 @@
#include "gpt.h"
#include <popt.h>
using namespace std;
class GPTDataCL : public GPTData {
protected:
// Following are variables associated with popt parameters....
@@ -41,14 +39,14 @@ class GPTDataCL : public GPTData {
int BuildMBR(char* argument, int isHybrid);
public:
GPTDataCL(void);
GPTDataCL(string filename);
GPTDataCL(std::string filename);
~GPTDataCL(void);
void LoadBackupFile(string backupFile, int &saveData, int &neverSaveData);
void LoadBackupFile(std::string backupFile, int &saveData, int &neverSaveData);
int DoOptions(int argc, char* argv[]);
}; // class GPTDataCL
int CountColons(char* argument);
uint64_t GetInt(const string & argument, int itemNum);
string GetString(string argument, int itemNum);
uint64_t GetInt(const std::string & argument, int itemNum);
std::string GetString(std::string argument, int itemNum);
#endif

View File

@@ -90,7 +90,7 @@ void GPTDataCurses::EmptySpaces(void) {
// unpartitioned space on the disk.
// Returns the number of Spaces created.
int GPTDataCurses::MakeSpacesFromParts(void) {
uint i;
uint32_t i;
Space *tempSpace;
EmptySpaces();
@@ -608,7 +608,7 @@ void GPTDataCurses::MoveSelection(int delta) {
// Show user's options. Refers to currentSpace to determine which options to show.
// Highlights the option with the key selectedKey; or a default if that's invalid.
void GPTDataCurses::DisplayOptions(char selectedKey) {
uint i, j = 0, firstLine, numPerLine;
uint64_t i, j = 0, firstLine, numPerLine;
string optionName, optionDesc = "";
if (currentSpace != NULL) {

View File

@@ -27,12 +27,10 @@
#include "gptpart.h"
#include "gpt.h"
using namespace std;
struct MenuItem {
int key; // Keyboard shortcut
string name; // Item name; 8 characters
string desc; // Description
std::string name; // Item name; 8 characters
std::string desc; // Description
};
static struct MenuItem menuMain[] = {
@@ -81,7 +79,7 @@ protected:
Space *lastSpace;
Space *currentSpace;
int currentSpaceNum;
string whichOptions;
std::string whichOptions;
char currentKey;
int numSpaces;
int displayType;
@@ -130,7 +128,7 @@ public:
void ClearLine(int lineNum);
void ClearBottom(void);
void PromptToContinue(void);
void Report(string theText);
void Report(std::string theText);
void ShowTypes(void);
#endif

View File

@@ -15,17 +15,16 @@
#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
#ifdef USE_UTF16
#include <unicode/ustdio.h>
#else
#define UnicodeString string
#endif
#include <string.h>
#include <stdio.h>
#include <iostream>
#include "gptpart.h"
#include "attributes.h"
#ifdef USE_UTF16
#include <unicode/ustdio.h>
#else
#define UnicodeString std::string
#endif
using namespace std;

View File

@@ -23,8 +23,6 @@
#include "guid.h"
#include "attributes.h"
using namespace std;
// Values returned by GPTPart::IsSizedForMBR()
#define MBR_SIZED_GOOD 0 /* Whole partition under 2^32 sectors */
#define MBR_SIZED_IFFY 1 /* Partition starts under 2^32 & is less than 2^32, but ends over 2^32 */
@@ -59,7 +57,7 @@ class GPTPart {
// Simple data retrieval:
PartType & GetType(void) {return partitionType;}
uint16_t GetHexType(void) const;
string GetTypeName(void);
std::string GetTypeName(void);
UnicodeString GetUTypeName(void);
const GUIDData GetUniqueGUID(void) const {return uniqueGUID;}
uint64_t GetFirstLBA(void) const {return firstLBA;}
@@ -80,7 +78,7 @@ class GPTPart {
void SetLastLBA(uint64_t l) {lastLBA = l;}
void SetAttributes(uint64_t a) {attributes = a;}
void SetAttributes(void) {attributes.ChangeAttributes();}
void SetName(const string & theName);
void SetName(const std::string & theName);
#ifdef USE_UTF16
void SetName(const UnicodeString & theName);
#endif

View File

@@ -23,13 +23,11 @@
#include "gpt.h"
using namespace std;
class GPTDataTextUI : public GPTData {
protected:
public:
GPTDataTextUI(void);
GPTDataTextUI(string filename);
GPTDataTextUI(std::string filename);
~GPTDataTextUI(void);
// This one needs to be explicitly defined, even though it does nothing new....
@@ -55,17 +53,17 @@ class GPTDataTextUI : public GPTData {
void ShowDetails(void);
void MakeHybrid(void);
int XFormToMBR(void); // convert GPT to MBR, wiping GPT afterwards. Returns 1 if successful
uint64_t GetSectorNum(uint64_t low, uint64_t high, uint64_t def, const string & prompt);
uint64_t GetSectorNum(uint64_t low, uint64_t high, uint64_t def, const std::string & prompt);
// An informational function....
void WarnAboutIffyMBRPart(int partNum);
// Main menu functions
void MainMenu(string filename);
void MainMenu(std::string filename);
void ShowCommands(void);
void ExpertsMenu(string filename);
void ExpertsMenu(std::string filename);
void ShowExpertCommands(void);
void RecoveryMenu(string filename);
void RecoveryMenu(std::string filename);
void ShowRecoveryCommands(void);
}; // class GPTDataTextUI

12
guid.h
View File

@@ -30,8 +30,6 @@ typedef unsigned char my_uuid_t[16];
typedef uuid_t my_uuid_t;
#endif
using namespace std;
// Note: This class's data size is critical. If data elements must be added,
// it will be necessary to modify various GPT classes to compensate.
class GUIDData {
@@ -39,17 +37,17 @@ class GUIDData {
static bool firstInstance;
protected:
my_uuid_t uuidData;
string DeleteSpaces(string s);
std::string DeleteSpaces(std::string s);
public:
GUIDData(void);
GUIDData(const GUIDData & orig);
GUIDData(const string & orig);
GUIDData(const std::string & orig);
GUIDData(const char * orig);
~GUIDData(void);
// Data assignment operators....
GUIDData & operator=(const GUIDData & orig);
GUIDData & operator=(const string & orig);
GUIDData & operator=(const std::string & orig);
GUIDData & operator=(const char * orig);
void Zero(void);
void Randomize(void);
@@ -59,9 +57,9 @@ class GUIDData {
int operator!=(const GUIDData & orig) const;
// Data retrieval....
string AsString(void) const;
std::string AsString(void) const;
}; // class GUIDData
ostream & operator<<(ostream & os, const GUIDData & data);
std::ostream & operator<<(std::ostream & os, const GUIDData & data);
#endif

4
mbr.h
View File

@@ -13,8 +13,6 @@
#include "diskio.h"
#include "basicmbr.h"
using namespace std;
/****************************************
* *
* MBRData class and related structures *
@@ -26,7 +24,7 @@ class MBRData : public BasicMBRData {
protected:
public:
MBRData(void) {}
MBRData(string deviceFilename) : BasicMBRData(deviceFilename) {}
MBRData(std::string deviceFilename) : BasicMBRData(deviceFilename) {}
MBRData & operator=(const BasicMBRData & orig);
~MBRData(void);

View File

@@ -32,8 +32,6 @@
#define EBR 4 /* sector is used as an EBR or MBR */
#define INVALID 8 /* sector number is too large for disk */
using namespace std;
// Data for a single MBR partition record
// Note that firstSector and lastSector are in CHS addressing, which
// splits the bits up in a weird way.

View File

@@ -6,16 +6,14 @@
#include <stdint.h>
#include <stdlib.h>
#ifdef USE_UTF16
#include <unicode/ustream.h>
#else
#define UnicodeString string
#endif
#include <string>
#include "support.h"
#include "guid.h"
using namespace std;
#ifdef USE_UTF16
#include <unicode/ustream.h>
#else
#define UnicodeString std::string
#endif
// A partition type
struct AType {
@@ -24,7 +22,7 @@ struct AType {
// codes required by GPT
uint16_t MBRType;
GUIDData GUIDType;
string name;
std::string name;
int display; // 1 to show to users as available type, 0 not to
AType* next;
}; // struct AType
@@ -48,7 +46,7 @@ public:
int AddType(uint16_t mbrType, const char * guidData, const char * name, int toDisplay = 1);
// New assignment operators....
PartType & operator=(const string & orig);
PartType & operator=(const std::string & orig);
PartType & operator=(const char * orig);
// Assignment operators based on base class....
@@ -58,7 +56,7 @@ public:
PartType & operator=(uint16_t ID); // Use MBR type code times 0x0100 to assign GUID
// Retrieve transformed GUID data based on type code matches
string TypeName(void) const;
std::string TypeName(void) const;
UnicodeString UTypeName(void) const;
uint16_t GetHexType() const;

View File

@@ -8,7 +8,7 @@
#include <stdlib.h>
#include <string>
#define GPTFDISK_VERSION "1.0.8.2"
#define GPTFDISK_VERSION "1.0.8.3"
#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)
// Darwin (Mac OS) & FreeBSD: disk IOCTLs are different, and there is no lseek64
@@ -69,18 +69,16 @@
#define GPT_RESERVED 420
#define NAME_SIZE 36 // GPT allows 36 UTF-16LE code units for a name in a 128 byte partition entry
using namespace std;
string ReadString(void);
uint64_t GetNumber(uint64_t low, uint64_t high, uint64_t def, const string & prompt);
std::string ReadString(void);
uint64_t GetNumber(uint64_t low, uint64_t high, uint64_t def, const std::string & prompt);
char GetYN(void);
uint64_t IeeeToInt(string IeeeValue, uint64_t sSize, uint64_t low, uint64_t high, uint32_t sectorAlignment, uint64_t def = 0);
string BytesToIeee(uint64_t size, uint32_t sectorSize);
unsigned char StrToHex(const string & input, unsigned int position);
int IsHex(string input); // Returns 1 if input can be hexadecimal number....
uint64_t IeeeToInt(std::string IeeeValue, uint64_t sSize, uint64_t low, uint64_t high, uint32_t sectorAlignment, uint64_t def = 0);
std::string BytesToIeee(uint64_t size, uint32_t sectorSize);
unsigned char StrToHex(const std::string & input, unsigned int position);
int IsHex(std::string input); // Returns 1 if input can be hexadecimal number....
int IsLittleEndian(void); // Returns 1 if CPU is little-endian, 0 if it's big-endian
void ReverseBytes(void* theValue, int numBytes); // Reverses byte-order of theValue
void WinWarning(void);
string ToLower(const string& input);
std::string ToLower(const std::string& input);
#endif