Leon Matthes uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.threaded-LM.3348.mcz
==================== Summary ====================
Name: VMMaker.threaded-LM.3348 Author: LM Time: 23 November 2023, 5:07:58.598833 pm UUID: c652b1df-5728-4cc0-89ef-c735a6134916 Ancestors: VMMaker.threaded-LM.3347
Fix VMProfileLinuxSupportPlugin>>#primitiveExectuableModules
64-bit linux handles the linux-gate.so.1 differently which lead to memory-corruption due to the primitive expecting to filter out a single item.
=============== Diff against VMMaker.threaded-LM.3347 ===============
Item was changed: ----- Method: VMProfileLinuxSupportPlugin>>primitiveExecutableModules (in category 'primitives') ----- primitiveExecutableModules "Answer an Array of pairs of strings for executable modules (the VM executable and loaded libraries). The first element in each pair is the filename of the module. The second element is either nil or the symlink's target, if the filename is a symlink." <export: true> | resultObj | numModules := 0. self dl_iterate_phdr: #countnummodules _: 0. resultObj := interpreterProxy instantiateClass: interpreterProxy classArray + indexableSize: numModules * 2. - indexableSize: numModules - 1 * 2. "skip the fake linux-gate.so.1" resultObj = 0 ifTrue: [^interpreterProxy primitiveFailFor: PrimErrNoMemory]. interpreterProxy pushRemappableOop: resultObj. primErr := numModules := 0. self dl_iterate_phdr: #reapmodulesymlinks _: 0. resultObj := interpreterProxy popRemappableOop. primErr ~= 0 ifTrue: [^interpreterProxy primitiveFailFor: primErr]. ^interpreterProxy methodReturnValue: resultObj!
Item was changed: ----- Method: VMProfileLinuxSupportPlugin>>reap:module:symlinks: (in category 'iteration callbacks') ----- reap: info module: size symlinks: ignored "like reap:module:names:, but follows symlinks" <var: 'info' type: #'struct dl_phdr_info *'> <var: 'size' type: #'size_t'> <var: 'ignored' type: #'void *'> <returnTypeC: #int> | elfModuleName len moduleNameObj symLinkBuf | <var: 'elfModuleName' type: #'const char *'> <var: 'symLinkBuf' declareC: 'char symLinkBuf[PATH_MAX]'> elfModuleName := numModules > 0 ifTrue: [info dlpi_name] ifFalse: [self getAttributeString: 0]. (elfModuleName isNil or: [(len := self strlen: elfModuleName) = 0]) ifTrue: + [^0]. "skip the fake linux-gate.so.1 --- NOTE: On 64-bit linux this is linux-vdso.so.1 + and doesn't seem to appear as a zero-length/nullptr string!! + It also doesn't seem to hurt anything to leave it in the list." - [^0]. "skip the fake linux-gate.so.1" moduleNameObj := interpreterProxy instantiateClass: interpreterProxy classString indexableSize: len. moduleNameObj = 0 ifTrue: [primErr := PrimErrNoMemory. ^1]. "stop iteration" self strncpy: (interpreterProxy arrayValueOf: moduleNameObj) _: elfModuleName _: len. "(char *)strncpy()" interpreterProxy storePointer: numModules ofObject: interpreterProxy topRemappableOop withValue: moduleNameObj. "now dereference the symlink, if it exists" self str: symLinkBuf cpy: elfModuleName. (len := self read: elfModuleName li: symLinkBuf nk: #'PATH_MAX') > 0 ifTrue: [moduleNameObj := interpreterProxy instantiateClass: interpreterProxy classString indexableSize: len. moduleNameObj = 0 ifTrue: [primErr := PrimErrNoMemory. ^1]. "stop iteration" self strncpy: (interpreterProxy arrayValueOf: moduleNameObj) _: symLinkBuf _: len. "(char *)strncpy()" interpreterProxy storePointer: numModules + 1 ofObject: interpreterProxy topRemappableOop withValue: moduleNameObj] ifFalse: [interpreterProxy storePointer: numModules + 1 ofObject: interpreterProxy topRemappableOop withValue: interpreterProxy nilObject]. numModules := numModules + 2. ^0!
vm-dev@lists.squeakfoundation.org