pert:
You might give it a try without the symlink, just in case there's a problem with that usage. I use symlinks for the purposes of installing boards platforms and Arduino libraries constantly, but I've never tried it with platform.local.txt.
I'd not have thought that was very likely, since the IDE is explicitly resolving the path to be in /usr/local for the sake of the output message. However I'm /not/ saying I don't think it's worth trying... unfortunately it doesn't appear to help. If I make up a real directory and do a verify I get
Using board '649' from platform in folder: /home/markMLl/Arduino/hardware/ButterflyCore/avr
Using core 'butterflycore' from platform in folder: /home/markMLl/Arduino/hardware/ButterflyCore/avr
Detecting libraries used...
/home/markMLl/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics
-DPLATFORM_TXT=/usr/local/src/butterflycore/ButterflyCore-master/avr/platform.txt
...
The value of the -D was what I'd hardcoded into the file, which is obviously now not quite right. the important thing is that I can verify that there's a platform.local.txt in the same place as the platform.txt, and it's still being ignored 
Unfortunately, there is no consistently used term for this thing. It's actually more common for it to be referred to as "core" than "platform". It is also sometimes referred to as "package".
I meant I was expecting to see it in a filename. I think that the problem is that the original arduino binary runs ...bin/java as a child, and I wasn't tracing into children. Here's what it looks like with strace's -f option, grepping for platform.local.txt:
18600 stat("/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", <unfinished ...>
18600 <... stat resumed> {st_mode=S_IFREG|0644, st_size=524, ...}) = 0
18600 access("/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", R_OK) = 0
18600 openat(AT_FDCWD, "/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", O_RDONLY) = 95
18600 stat("/home/markMLl/.arduino15/packages/arduino/hardware/avr/1.8.3/platform.local.txt", 0x7fb6cb5ec430) = -1 ENOENT (No such file or directory)
18600 stat("/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=524, ...}) = 0
18600 access("/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", R_OK) = 0
18600 openat(AT_FDCWD, "/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", O_RDONLY) = 95
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 access("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", R_OK) = 0
18600 openat(AT_FDCWD, "/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", O_RDONLY) = 95
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt~", {st_mode=S_IFREG|0644, st_size=788, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt~", {st_mode=S_IFREG|0644, st_size=788, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt~", {st_mode=S_IFREG|0644, st_size=788, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", <unfinished ...>
18600 <... stat resumed> {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", <unfinished ...>
18600 <... stat resumed> {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", <unfinished ...>
18600 <... stat resumed> {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt~", {st_mode=S_IFREG|0644, st_size=788, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt~", {st_mode=S_IFREG|0644, st_size=788, ...}) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt~", {st_mode=S_IFREG|0644, st_size=788, ...}) = 0
18664 newfstatat(AT_FDCWD, "/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=524, ...}, 0) = 0
18664 openat(AT_FDCWD, "/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", O_RDONLY|O_CLOEXEC) = 3
18664 newfstatat(AT_FDCWD, "/home/markMLl/.arduino15/packages/arduino/hardware/avr/1.8.3/platform.local.txt", 0xc0002cced8, 0) = -1 ENOENT (No such file or directory)
18664 newfstatat(AT_FDCWD, "/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=593, ...}, 0) = 0
18664 openat(AT_FDCWD, "/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", O_RDONLY|O_CLOEXEC) = 3
18675 newfstatat(AT_FDCWD, "/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=524, ...}, 0) = 0
18675 openat(AT_FDCWD, "/usr/local/lib/arduino/arduino-1.8.12/hardware/arduino/avr/platform.local.txt", O_RDONLY|O_CLOEXEC) = 3
18675 newfstatat(AT_FDCWD, "/home/markMLl/.arduino15/packages/arduino/hardware/avr/1.8.3/platform.local.txt", <unfinished ...>
18675 <... newfstatat resumed> 0xc0002c8d38, 0) = -1 ENOENT (No such file or directory)
18675 newfstatat(AT_FDCWD, "/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=593, ...}, 0) = 0
18675 openat(AT_FDCWD, "/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", O_RDONLY|O_CLOEXEC <unfinished ...>
18675 <... openat resumed> ) = 3
Also I can explicitly see this equence:
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.txt", {st_mode=S_IFREG|0644, st_size=7364, ...}) = 0
18600 access("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.txt", R_OK) = 0
18600 openat(AT_FDCWD, "/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.txt", O_RDONLY) = 95
18600 fstat(95, {st_mode=S_IFREG|0644, st_size=7364, ...}) = 0
18616 futex(0x7fb6bc32e57c, FUTEX_WAIT_PRIVATE, 0, {tv_sec=4, tv_nsec=999999651} <unfinished ...>
18600 read(95, "\n# Arduino AVR Core and platform"..., 8192) = 7364
18600 fstat(95, {st_mode=S_IFREG|0644, st_size=7364, ...}) = 0
18600 lseek(95, 0, SEEK_CUR) = 7364
18600 read(95, "", 8192) = 0
18600 close(95) = 0
18600 stat("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 access("/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", R_OK) = 0
18600 openat(AT_FDCWD, "/home/markMLl/Arduino/hardware/ButterflyCore/avr/platform.local.txt", O_RDONLY) = 95
18600 fstat(95, {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 read(95, "\n# These can be overridden in pl"..., 8192) = 593
18600 fstat(95, {st_mode=S_IFREG|0644, st_size=593, ...}) = 0
18600 lseek(95, 0, SEEK_CUR) = 593
18600 read(95, "", 8192) = 0
18600 close(95) = 0
So the file is apparently being found and read, but the content ignored.
I think this is getting outside what a non-IDE-developer can usefully comment on. However I'd note that most if not all of the platform.local.txt files on this system already contain board identification text which should be easily recognisable in the compiler output, and since it's not in fact there it suggests that it's not a question of an incorrectly-read file overriding the right one.
MarkMLl