Viewing Issue Advanced Details
|ID||Category [?]||Severity [?]||Reproducibility||Date Submitted||Last Update|
|06796||Compiling||Minor||Always||Dec 16, 2017, 21:44||Mar 23, 2019, 14:11|
|Tester||EoceneMiacid||View Status||Public||Platform||MAME (Self-compiled)|
|Assigned To||Resolution||Fixed||OS||Linux (64-bit)|
|Version||0.192||Fixed in Version||Build||64-bit|
|Summary||06796: spectrum and clones: Unable to compile tinybuild with spectrum included due to microdrive-related error|
Ever since 0.190 (I presume), I cannot compile a tiny build with the spectrum driver included anymore.
Probably related to the recent microdrive changes?
../../../../linux_gcc/bin/x64/Release/mame_tinymame/liboptional.a(intf1.o): In function `spectrum_intf1_device::spectrum_intf1_device(machine_config const&, char const*, device_t*, unsigned int)':
intf1.cpp:(.text+0x2fa): undefined reference to `vtable for device_finder<microdrive_image_device, true>'
../../../../linux_gcc/bin/x64/Release/mame_tinymame/liboptional.a(intf1.o): In function `delegate_generic_class* delegate_base<void, int>::late_bind_helper<microdrive_image_device>(delegate_late_bind&)':
intf1.cpp:(.text._ZN13delegate_baseIvJiEE16late_bind_helperI23microdrive_image_deviceEEP22delegate_generic_classR18delegate_late_bind[_ZN13delegate_baseIvJiEE16late_bind_helperI23microdrive_image_deviceEEP22delegate_generic_classR18delegate_late_bind]+0x4): undefined reference to `typeinfo for microdrive_image_device'
intf1.cpp:(.text._ZN13delegate_baseIvJiEE16late_bind_helperI23microdrive_image_deviceEEP22delegate_generic_classR18delegate_late_bind[_ZN13delegate_baseIvJiEE16late_bind_helperI23microdrive_image_deviceEEP22delegate_generic_classR18delegate_late_bind]+0x30): undefined reference to `typeinfo for microdrive_image_device'
../../../../linux_gcc/bin/x64/Release/mame_tinymame/liboptional.a(intf1.o): In function `spectrum_intf1_device::device_add_mconfig(machine_config&)':
intf1.cpp:(.text.unlikely+0x6f): undefined reference to `MICRODRIVE'
intf1.cpp:(.text.unlikely+0x95): undefined reference to `microdrive_image_device::comms_in_w(int)'
collect2: error: ld returned 1 exit status
tinymame.make:250: recipe for target '../../../../../tinymame64' failed
make: *** [../../../../../tinymame64] Error 1
Makefile:97: recipe for target 'tinymame' failed
make: *** [tinymame] Error 2
makefile:1243: recipe for target 'linux_x64' failed
make: *** [linux_x64] Error 2
|Steps To Reproduce||
Compile mame source with
make TARGET=mame SUBTARGET=tinymame SOURCES=src/mame/drivers/spectrum.cpp REGENIE=1 -j5
|Affected Sets / Systems||spectrum and clones|
|There are no relationship linked to this issue.|
Dec 18, 2017, 17:24
For a SOURCES build you don't need to do TARGET=mame.
That said, with current GIT I can't reproduce this doing a clean compile with your exact line.
Dec 18, 2017, 22:01
|I, too, am unable to produce a error attempting to compile spectrum.cpp. I tried 0.192 in a DEBUG=1 build as well as current GIT from this morning (32-bit) and neither failed.|
Dec 26, 2017, 21:34
This was reported to me as happening with the Internet Archive's Emscripten compile as well and I was able to reproduce it in the Emscripten environment.
The issue is that by default, the behaviour of the linker is dependent on the order in which .a files are specified on the command line passed to the linker. If the files are in the wrong order or if there is a circular dependency, the linker can incorrectly designate some functions as being never called and drop them, when in fact they are used and needed.
Rather than debugging the exact issue, the easy workaround is to pass the "--start-group" parameter to the linker which makes it evaluate all of the .a files as a single group and prevents this problem. This has already been done for MAME in scripts/genie.lua but only for the mingw* configuration. EoceneMiacid is compiling on Linux so likely the same parameter is needed there as well, and really for all configurations.
Unfortunately an upstream fix is needed before this can be done for the Emscripten port: https://github.com/kripken/emscripten/issues/5982
Mar 28, 2018, 18:05
Is this something I can do myself? I looked at the makefile and added the parameter to the linker but that doesn't appear to work.
The hng64 driver has the same issue since a release or two ago, as well.
Mar 23, 2019, 14:11
For the record, I successfully used:
make SOURCES=src/mame/drivers/spectrum.cpp NOWERROR=1 REGENIE=1 LDOPTS=-Wl,--start-group