QNX Technical Articles
QNX® SDP 7.0.4 Kernel and Tools: Release Notes
Date of this edition: August 24, 2020
![]() |
Changes to these notes since May 31, 2019 are highlighted below
with this icon:
![]() |
Target OS: This product is compatible with targets that are running QNX® Neutrino® 7.0.
Host OS: In order to install this product, you must have installed the QNX Software Development Platform 7.0 on one of the following development hosts:
- Microsoft Windows 10 Pro 64-bit or Windows 8.1 Pro 64-bit
- macOS version 10.10 through 10.14
- Linux Red Hat Enterprise Linux 7 64-bit, Ubuntu Desktop 18.04 LTS 64-bit, or Ubuntu Desktop 16.04 LTS 64-bit, on x86_64 processors (QNX SDP 7 isn't supported on Linux on ARM processors)
![]() |
|
We've reissued this update to address some critical issues.
If you've already installed it, install the packages that have a new build ID, as given in
"What's in this update?"
You can use the kernel's timestamp (from the output of uname -a) to determine whether
or not you've installed the latest version:
Architecture | Old timestamp | New timestamp |
---|---|---|
AArch 64 | 2019/05/24-02:00:41EDT | 2019/06/07-20:27:40EDT |
ARMv7 | 2019/05/24-02:11:39EDT | 2019/06/07-20:38:44EDT |
32-bit x86 | 2019/05/24-02:22:26EDT | 2019/06/07-20:49:36EDT |
64-bit x86 | 2019/05/24-02:33:17EDT | 2019/06/07-21:00:46EDT |
Contents...
- What's in this update?
- Fixed issues and new features:
- Deprecation notices
- Experimental items
- Known issues
- Technical support
Throughout this document, you may see reference numbers associated with particular issues, changes, etc. When corresponding with our Technical Support staff about a given issue, please quote the relevant reference number. You might also find the reference numbers useful for tracking issues as they become fixed.
All references to POSIX standards in this release note are to The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition.
See also the release notes for the following:
- QNX Software Development Platform 7.0
- QNX SDP 7.0 Core OS
- QNX SDP 7.0 Security Update (Build ID 861)
- QNX SDP 7.0 Kernel and libc (Build ID 7.0.991.S201809180259)
What's in this update?
This update includes a number of packages, which you'll find under QNX Software Development Platform. We recommend you install them in the order given below. Choose the Tools packages that are appropriate for your development host.
![]() |
As you install packages, some of the others may migrate from the Available tab to the Updates tab. |
- Microkernel -> QNX SDP 7.0 Kernel and libc
- Microkernel -> QNX SDP 7.0 Microkernel - System Logger (slogger2)
- OS Services -> QNX SDP 7.0 OS Services - GCC target contents
- OS Services -> QNX SDP 7.0 OS Services - Math Library
- Tools -> Tools - Binutils
- BSP & Drivers -> QNX SDP 7.0 Drivers - libfdt
- OS Security -> QNX SDP 7.0 Security - Mandatory access control (MAC) security policy support
- OS Services -> QNX SDP 7.0 OS Services - IPL support
- Tools -> Tools - GCC
- Tools -> Tools - Image Utilities
- Tools -> Tools - QCC Compiler Interfaces
- Tools -> Tools - Security Policies
You can optionally install the QNX Hypervisor, which you'll find in QNX Hypervisor -> Products -> QNX Hypervisor.
Here's a summary of the packages:
Package | Build ID |
---|---|
com.qnx.sdp.host.linux.x86_64.binutils | 7.0.4006.S201904261143 |
com.qnx.sdp.host.linux.x86_64.gcc | 7.0.4006.S201904261531 |
com.qnx.sdp.host.linux.x86_64.mkxfs | 7.0.4201.S201905240254 |
com.qnx.sdp.host.linux.x86_64.qcc | 7.0.4016.S201904261531 |
com.qnx.sdp.host.linux.x86_64.secpol | 7.0.4201.S201905240254 |
com.qnx.sdp.host.macos.x86_64.binutils | 7.0.4006.S201904261143 |
com.qnx.sdp.host.macos.x86_64.gcc | 7.0.4006.S201904261531 |
com.qnx.sdp.host.macos.x86_64.mkxfs | 7.0.4201.S201905240254 |
com.qnx.sdp.host.macos.x86_64.qcc | 7.0.4016.S201904261531 |
com.qnx.sdp.host.macos.x86_64.secpol | 7.0.4201.S201905240254 |
com.qnx.sdp.host.win.x86_64.binutils | 7.0.4006.S201904261143 |
com.qnx.sdp.host.win.x86_64.gcc | 7.0.4006.S201904261531 |
com.qnx.sdp.host.win.x86_64.mkxfs | 7.0.4201.S201905240254 |
com.qnx.sdp.host.win.x86_64.qcc | 7.0.4016.S201904261531 |
com.qnx.sdp.host.win.x86_64.secpol | 7.0.4201.S201905240254 |
com.qnx.sdp.target.tools.cpp | 7.0.4007.S201905240922 |
com.qnx.sdp.target.tools.cpp.dbg | 7.0.4007.S201905240922 |
com.qnx.sdp.target.base.libm | 7.0.4201.S201905240254 |
com.qnx.sdp.target.base.libm.dbg | 7.0.4201.S201905240254 |
com.qnx.sdp.target.drivers.libfdt | 7.0.4201.S201905240254 |
com.qnx.sdp.target.drivers.libfdt.dbg | 7.0.4201.S201905240254 |
com.qnx.sdp.target.hypervisor.kernel_module | ![]() |
com.qnx.sdp.target.microkernel.core | ![]() |
com.qnx.sdp.target.microkernel.core.dbg | ![]() |
com.qnx.sdp.target.microkernel.slogger2 | 7.0.4201.S201905240254 |
com.qnx.sdp.target.microkernel.slogger2.dbg | 7.0.4201.S201905240254 |
com.qnx.sdp.target.security.secpol | 7.0.4201.S201905240254 |
com.qnx.sdp.target.security.secpol.dbg | 7.0.4201.S201905240254 |
com.qnx.sdp.target.base.ipl | 7.0.4201.S201905240254 |
com.qnx.sdp.target.base.ipl.dbg | 7.0.4201.S201905240254 |
com.qnx.sdp.target.hypervisor.group | ![]() |
To see a list of the contents of a package, right-click it in the QNX Software Center, choose Properties, and then click Package Contents.
Fixed issues and new features
Fixed issues: Kernel
- The version number of the kernel is now 7.0.4.
We've corrected race conditions that could cause a kernel crash while synchronizing the virtual memory cache. (Ref# J2542744, J2543143)
The process manager's threads now have stack guard pages. (Ref# J2688409)
Each thread has a software timer that's used for usleep(), TimerTimeout(), and other blocking operations. There's a new procnto -t option that causes this timer to be allocated when the thread is created; the thread isn't created if the timer can't be allocated. By default, or if you specify the -~t option, the timer is allocated the first time it's needed. (Ref# J2514168)
There's a new -c option for procnto that lets you specify the maximum difference tolerated between the clock cycles of the system's CPUs. (Ref# J2661488, J2680656)
If you explicitly specify in startup that the clocks on the system's CPUs are synchronized, the kernel now sets the offset between the clocks to 0. (Ref# J2721066)
The procnto image filesystem now supports combined seeks and reads. (Ref# J2686437)
We've corrected a race condition that could cause the kernel to crash on some boards with aggressive speculative execution. (Ref# J2633769)
There's a new -bl option for procnto that makes calls to procmgr_ability() that specify locked abilities not fail. (Ref# J2646385)
We've corrected an issue where the FPU wasn't disabled correctly when a thread terminated, potentially resulting in corrupt FPU data for another thread that subsequently used the FPU. (Ref# J2748737)
If you specify -mL~l in the memory management flags for procnto, the ~l no longer turns off locking. The L option locks and superlocks all memory; turning off locking while superlocking is enabled isn't useful. (Ref #J2746113)
We've corrected a memory overrun issue that could cause a kernel crash on 64-bit platforms when spare memory left over from kernel bootstrapping was added to the kernel heap. (Ref# J2744562)
We've corrected an issue that could cause errors from kernel APIs to be suppressed when Qnet was used. (Ref# J2588698)
- We've optimized some TLB flushes on AArch64. (Ref# J2512220)
- There's a new -n option that makes procnto
use nonlazy stack allocation, reserving memory for the stack when a thread is allocated.
By default, physical memory for a thread's stack is allocated on demand.
Specifying -n guarantees that page faults on stacks won't result in a
SIGBUS if the system runs out of memory.
When combined with -mL (superlocking), this option ensures that stack memory is prefaulted
to the maximum size, which means that there shouldn't be any page faults for (legitimate) access to stack memory.
(Ref# J1595839)
If you specify this option, you can't use pthread_attr_setstacklazy() to specify a lazy stack. If you want a thread to have a lazy stack, use mmap() with MAP_LAZY to allocate an area for the stack, and then call pthread_attr_setstack().
- We've corrected an error that made the kernel hang instead of crashing in certain error conditions on ARMv7 and AArch64. (Ref# J2650473)
- The system page now includes a custom callout:
uintptr_t (*custom_callout)(struct syspage_entry *syspageptr, uint32_t type_id, uintptr_t *regs)
where type_id is the calling process's type (can be used by the callout for permission checking), and regs is an array holding the register values of the calling thread. The exception handler invokes the custom callout without acquiring the kernel lock and without enabling interrupts. When the callout returns, the return value is written to the thread's status register and user mode is resumed. For more information, see the "Kernel Callouts" chapter of Building Embedded Systems. (Ref# J2628628 [SFDC Case 00171268])
- We've implemented a workaround for Spectre variant 2 on AArch64 targets.
(Ref# J2518057, J2655875, J2663131, J2663136)
In order to use this workaround, you must have installed a version of startup-* that supports the -E spectrev2 option.
- We've reduced the time needed to load libraries on 64-bit systems where the system time isn't set correctly. (Ref# J2620979)
- A certain pattern of file-backed mmap() and munmap() operations no longer causes extra priority 1 pulses to be sent to procnto. (Ref# J2704806)
- We've fixed an issue that could cause the system to crash if it ran out of kernel virtual memory while doing user page table allocation. (Ref# J2701716)
- We've fixed an issue with tracking memory protection that occurred if you used mprotect() to set the protection for a partially mapped area. (Ref# J2376716)
- We've improved the coordination of clocks on multiprocessor systems so that the timestamps in event logs are synchronized. (Ref# J2660990)
- Using the waitfor command in a buildfile script no longer causes a stack overflow in the kernel. (Ref# J2615352 [SFCase00171369])
- We've fixed an issue that could cause processes using a robust mutex to hang on pthread_mutex_lock(). (Ref# J2722087 [SFDC Case: 00175237])
- We've fixed an issue that could cause priority inversion if the priority of a pulse was boosted. (Ref# J2718284)
- We've corrected an issue that could cause the kernel to crash when system memory was exhausted. (Ref# J2715469)
- We've optimized the hardware address translation (HAT) code and fixed some potential race conditions. (Ref# J2532638, J2542609, J2626734)
- Interrupts are no longer enabled in the startup for ARM and AArch64 targets before the kernel is ready to handle them. (Ref# J2275915)
- The adaptive partitioning scheduler no longer flags some false bankruptcy events in the trace log. (Ref# J2631349)
- When we run out of a particular typed memory, the kernel no longer attempts to allocate memory anyway. (Ref# J2622812)
- SCHED_APS_PSTATS_IS_BANKRUPT_NOW is now set correctly when the number of used critical cycles is strictly equal to the critical budget in cycles. Bankruptcy notification is no longer missed when a thread in another partition with available budget is made ready at the same time and on the same CPU as where the critical thread runs out of critical budget. (Ref# J2507756)
- We've corrected an off-by-one error in the checking of DCMD_PROC_* commands for the /proc filesystem. (Ref# J2550948)
- We've corrected an issue that could cause the memory manager's cleanup operations to run at the highest priority level when unmapping file-backed memory, including at process termination. The default priority for the memory manager's cleanup operations is now 10. (Ref# J2618658 [SFDC Case: 00171743])
- We've corrected an issue that could cause a crash in an ISR on the Cortex-A8. (Ref# J1682905)
- We've improved the performance of spin locks on AArch64 targets. (Ref# J2580472)
- The DCMD_PROC_GETFPREG and DCMD_PROC_SETFPREG devctl() commands now use a buffer whose size depends on the target architecture. (Ref# J2607387 [SFDC Case: 00171429])
- The expiry of normal-resolution timers is no longer delayed if any process in your system uses high-resolution timers, (Ref# J2394360, J2419706)
- If thread cancelation is attempted during an I/O routine (like fprintf), the locks associated with that file I/O stream are now correctly released before the thread termination is complete. (Ref# J2520540)
Fixed issues: Host tools and OS services
The host tools and OS services include the following updates:
- gcc
-
- We've addressed some issues with code generation that caused failures in some test cases. (Ref# J2504890, J2567428)
- C++11 Lambda functions now function properly when O3 or O4 optimization is used. (Ref# J2544183)
- gdb
- GDB no longer hangs when you start a program with the run command on a remote AArch64 target. (Ref# J2629125)
We've corrected an issue on 32-bit x86 targets where certain coding patterns resulting in the linker emitting an R_386_IRELATIVE relocation were crashing on execution. Examples of these are GCC ifunc resolvers or target multiversioning attributes. (Ref #J2742049)
- STT_GNU_IFUNC symbols are now being handled correctly on all architectures. (Ref# J1681830, J2661291)
- The default per-client buffer size is now 64 KB. If you specify a different size, it's rounded up to the nearest multiple of the page size (4 KB). (Ref# J2629022)
- slogger2 now registers its local name in a more secure way. (Ref# J2547953)
- This utility now retains the QNX_info section in bootstrap executables. (Ref# J2642939)
- This utility now correctly sets permissions when you use the symbolic form to set file or directory permissions (the perms or dperms attribute). (Ref# J2479118)
- If you set the environment variable MKIFS_PATH to an empty string, mkifs overrides all the default search paths (e.g., under QNX_TARGET) with paths relative to "". While this is expected, it may still be confusing, so mkifs now issues a warning.
- We've corrected an issue that could cause a SIGSEGV while processing a boot file during the creation of an OS image. (Ref# J2654717)
- We've corrected an issue in the parsing of global environment variables inside bootstrap sections. (Ref# J2603865)
![]() |
The QNX SDP Host Tools (7.0 BuildID 1037) update introduced a new QNX Development License Agreement (QDL) and license checking for tools that you run on a development host. For more information, see the release notes for that update. |
Fixed issues: C library
The C library includes the following new functions:
- mmap_peer()
- Create a virtual mapping in the address space of another process (Ref# J2685196)
- munmap_peer()
- Unmap a part of the virtual address space in another process (Ref# J2685196)
The C library also includes the following updates:
- access()
This function no longer fails if you specify X_OK for a directory, and the underlying filesystem has been mounted with the noexec option. (Ref# J2617113)
- atexit()
It's now safe to call atexit() from a shared object that's meant to be dynamically opened using dlopen(). (Ref# J521222)
- ChannelCreate()
- There's a new _NTO_CHF_INHERIT_RUNMASK flag that makes a thread inherit the sender's runmask when a thread receives a message on the channel; when a thread receives a pulse on the channel, the thread reverts to its default runmask. If the receiving thread is running on a processor that the runmask excludes, the thread is rescheduled. (Ref# J2695287)
- ChannelDestroy()
- We've addressed an issue where preemption could prevent the destruction of a channel from being completed if the channel still had connections. (Ref# J168775)
- ClockTime()
- We've improved the accuracy of the computation of execution times for a thread. (Ref# J2669090 [SFDC Case: 00173057])
- devctl()
- You can now use the DCMD_PROC_GETREGSET and DCMD_PROC_SETREGSET commands to get and set the ACTLR_EL1 register on AArch64 targets. Your process needs to have the PROCMGR_AID_PRIVREG ability enabled in order to get or set this register, and your startup must set AARCH64_CPU_ACTLR in cpuinfo.flags in the system page. (Ref# J2529394 [SFDC Case 00169034])
- dlsym()
- This function no longer gives an "invalid handle" error after you use dlopen() to open a shared library multiple times and then use dlclose() to close one instance. (Ref# J2551993)
- fcntl()
- POSIX requires that fcntl( fd, F_SETFD, ...) return a value other than -1 on success. This function now specifically returns 0 in this case. (Ref# J2631607)
- forksafe_mutex_destroy()
- This function now correctly decrements the number of mutex holders if the mutex is locked by the caller. (Ref# J2595534)
- fwrite()
- We've corrected an issue that could cause line-buffered output to be corrupted. (Ref# J2594241)
- getrlimit(), setrlimit()
- There's a new RLIMIT_TIMERS_NP limit that specifies the maximum number of timers that a process can create. If this limit is exceeded, attempts to create timers by calling timer_create() or TimerCreate() fail with an error of EAGAIN. Note that this limit doesn't apply to TimerTimeout(). (Ref# J2634927 [SFDC Case 00172391])
- InterruptAttach(), InterruptAttachArray(), InterruptAttachEvent()
There's a new _NTO_INTR_FLAGS_EXCLUSIVE flag that requests exclusive access to the interrupt vector. (Ref# J2728925, J2729651)
- I/O privileges
- You no longer need I/O privileges to attach interrupts:
API Permission check InterruptAttach() Check if the process has PROCMGR_AID_INTERRUPT. If not, return EPERM. InterruptAttachArray() Check if the process has PROCMGR_AID_INTERRUPT. If not, return EPERM. InterruptAttachEvent() Check if the process has PROCMGR_AID_INTERRUPTEVENT. If not, check if it has PROCMGR_AID_INTERRUPT. If no, return EPERM. InterruptCharacteristic() If id is -1, check if the calling thread has I/O privileges. This is the same as before. InterruptCharacteristic() If id isn't -1, check if the calling process is the one that installed the handler or event. If not, return EPERM. This applies to both get and set cases. InterruptDetach() Check if the calling process is the one that installed the handler or event. If not, return EPERM. InterruptMask() If id is -1, check if the calling thread has I/O privileges. This is the same as before. InterruptMask() If id isn't -1, check if the calling process is the one that installed the handler or event. If not, return EPERM. InterruptUnmask() If id is -1, check if the calling thread has I/O privileges. This is the same as before. InterruptUnmask() If id isn't -1, check if the calling process is the one that installed the handler or event. If not, return EPERM. (Ref# J2628634 [SFDC Case 00172016], J2651321)
- memchr(), memcmp(), memcpy(), memset(), strcat(), strchr(), strcmp(), strcpy(), strlen()
-
- You can now use the LIBC_STRINGS environment variable to select the
implementation of these functions for AArch64 targets:
- aarch64_neon — optimized for AARCH64 targets using NEON
- generic — the default
You no longer need to specify export LD_PRELOAD=/lib/libstringsa64.so in order to do this. This library is now empty. (Ref# J1009584, J2574990 [SFDC Case 00169111], J2734935)
- We've added versions of these functions that are optimized for x86_64. (Ref# J1009587)
- You can now use the LIBC_STRINGS environment variable to select the
implementation of these functions for AArch64 targets:
- memcmp()
- We've corrected an error that could cause incorrect results on x86_64 targets. (Ref# J2639545)
- memcmp_isr()
- This new function is similar to memcmp(), but it's safe for you to call it in an interrupt service routine. (Ref# J2574990 [SFDC Case 00169111])
- name_open()
- This function now accepts flags that correspond to the _NTO_COF_* flags that you can specify for ConnectAttach(). (Ref# J2553944)
- poll(), select()
- These functions can now use registered events. (Ref# J2539019)
- posix_spawnattr_setasid()
- This new function lets you specify the address space identifier for a child process:
int posix_spawnattr_setasid(posix_spawnattr_t * const attrp, uint32_t const asid);
You must also call posix_spawnattr_setxflags() to set the POSIX_SPAWN_SETASID extended flag before you call posix_spawn() to create the process. (Ref# J2628633 [SFDC Case 00172019])
- procmgr_ability()
- The following abilities are new:
- PROCMGR_AID_SIGEV_THREAD — governs a process's ability to use a SIGEV_THREAD sigevent. For a registered event, the ability check is done only when you call MsgRegisterEvent(). Other C library functions that are passed a sigevent as an argument do the ability check only for an unregistered SIGEV_THREAD event. (Ref# J2628642 [SFDC Case 00172391])
- PROCMGR_AID_PRIVREG — governs a process's ability to use the DCMD_PROC_GETREGSET and DCMD_PROC_SETREGSET devctl() commands to get and set the ACTLR_EL1 register on AArch64 targets. (Ref# J2529394 [SFDC Case 00169034])
- pthread_mutex_destroy()
We've fixed an issue that prevented a mutex from being destroyed in some circumstances, usually after an unsuccessful attempt to lock the mutex. (Ref# J2616661)
- readdir()
- This function no longer gives an error of EBADF when reading a directory populated with pathmgr nodes, or when processing a directory that was removed after being opened. (Ref# J2262519 [SFDC Case: 00166879], J2621598, J2624062)
- resmgr_ocb()
- We've improved the implementation, so that the structure that this function returns a pointer to can't be deleted while the OCB is in use. (Ref# J2716634)
- slog2_parse_all()
- The slog2 library now frees the mutexes that this function creates. (Ref# J2615976 [SFDC Case: 00171896])
- slog2_parse_static_buffer()
- This function no longer invokes its callback twice for the oldest packet in a buffer if the packet is a split packet and a rollover occurs. (Ref# J2688087)
- slog2_register()
-
- We've corrected an issue that caused a memory leak. (Ref# J2721953)
- This function now checks the configuration bounds of the buffers before initializing the buffers themselves. (Ref# J2608114)
- This function now correctly parses the value of the SLOG2_ALLOC_TYPE environment variable. (Ref# J2608108)
There's a new SLOG2_QUIET flag that makes slogger2 not emit error information on stderr for the buffer set that's being configured. (Ref# J2678881, J2684930)
- slog2f()
- The j format length specifier now determines the correct size of an intmax_t or uintmax_t. (Ref# J2696315)
- SyncCondvarWait()
We've fixed an issue that caused a memory leak. (Ref# J2615042)
- ThreadCreate()
- We've corrected an issue that could cause priority inversion in certain conditions that are unlikely to occur. (Ref# J2704800)
- tzset()
- We've corrected a deadlock in the function that occurred during thread cancellation. (Ref# J2696298)
Deprecation notices
We've deprecated the following and will remove them in a future release:
*-ld.gold, the
gold
version of the linker
Experimental items
![]() |
Experimental software is primarily provided for customers and the community to try out, and perhaps to get a glimpse of what might be in store for the future. For information about the use of experimental software, see the Commercial Software License Agreement (CSLA) or Partner Software License Agreement (PSLA) in the Licensing area of our website, http://www.qnx.com/legal/licensing/. |
The experimental items in this release are:
- QNX framework for integrity measurement (QFIM)
Trusted Platform Module (TPM)
The version of TPM that shipped with SDP 7.0 is deprecated and will be replaced with a different TPM service in a future release.
Known issues
This update includes the issues given below. See also the release notes for the following:
- QNX Software Development Platform 7.0
- QNX SDP 7.0 Core OS
- QNX SDP 7.0 Security Update (Build ID 861)
- QNX SDP 7.0 Kernel and libc (Build ID 7.0.991.S201809180259)
Known issues: Kernel
- In some of our tests, fewer signals are being delivered than expected. We're investigating to determine if this is caused by scheduling latency or if the hardware isn't delivering interprocess interrupts (IPIs) in a timely manner. (Ref# J2743915)
- If you've enabled tickless mode, and an interrupt arrives on a processor other than processor 0
while the OS is in tickless mode, the kernel might not return to normal mode.
(Ref# J2504279)
Workaround: Do one of the following:
- Use a hardware timer that can be accessed from any processor.
- If the clock tick interrupt must happen on processor 0, bind all interrupts to that processor.
- Don't enable tickless mode; that is, don't use the startup-* -Z option.
- When a client thread makes multiple notification requests on the same device, if one of the file descriptors
is closed while the client is blocked in select() or poll(),
then the client might not be unblocked.
For select(), it's unblocked only if the highest-numbered file descriptor is closed.
For poll(), it may depend on the order the file descriptors are listed in the
pollfd array.
(Ref# J2483089)
Workaround: Don't use select() or poll() on multiple fds to the same device, or if you do, don't close() one of those fds while blocked on it.
- After a high-resolution timer expires, if there are no more high-resolution timers in the near future,
the kernel returns to normal 1 ms ticking, but it doesn't try to return to the normal 1 ms offset,
so as to avoid adjusting the hardware unnecessarily.
For example, the clock ticks might be as follows:
1 2 3 4 // Set a high-resolution timer for 500 us from here 4.5 // Fire the high-resolution timer. Return to normal 1 ms ticks. 5.5 6.5
This may cause clock_gettime() to return times that aren't a multiple of the clock resolution returned by clock_getres(). (Ref# J2416004)
- The kernel doesn't recognize orphaned process groups (process groups in which the parent of every member is either itself a member of the group or isn't a member of the group's session) as required by POSIX. (Ref# J165028)
Known issues: Host tools and OS services
- gcc, g++
-
The changes to some header files mean that you'll get compile errors if you use the -ansi option. We discontinued support for C standards earlier than C99 in QNX SDP 7.0.
- In certain rare scenarios, the gcc 5.4 C++ compiler has been shown to miscalculate
optimizations with aggressive-loop-optimizations at -O2 and higher.
This issue doesn't manifest itself in later versions of gcc.
(Ref# J2146544)
Workaround: Specify -fno-aggressive-loop-optimizations whenever you use -O2 or higher with the C++ compiler.
- When you build an ARMv7 (32-bit) application, in some cases, the compiler generates ARM Thumb instructions
as a size optimization.
Attempts to call memcpy_isr() or memset_isr() from Thumb build code
could fail or not return properly. A failed function call is indicated by an application crash.
(Ref# J2520502)
Workaround: This issue occurs only when you link against the static variant of libc (libcS.a or libc.a). Use one of the following methods to avoid it:
- Make sure the calling code is of the same type (non-Thumb) as the destination function by building the object with -marm specified to the compiler.
- Link against the dynamic version of libc (libc.so).
- Due to unclear wording in ISO/IEC 14882:2011(E), GCC 5.4 chooses an
appropriate constructor to satisfy an empty initializer list of a class or struct,
even if that constructor is marked as explicit.
The resolution of Defect Reports 1518 and 1630 against the standard clarify this as incorrect behavior:
a constructor marked as explicit shouldn't be considered in the overload resolution set.
(Ref# J2636749)
Workaround: For consistency with later releases of the compiler and with other compilers, avoid using empty initializer lists where explicit constructors with default-valued parameters are available, or else incorrect code might be executed.
We identified a number of issues in our g++ toolchain during ISO/IEC 14882:2014 compliance testing. These issues have been sent upstream and are monitored internally as "fixed upstream in an upcoming release" (Ref# J2509996) and "tracked upstream with no fix yet available" (Ref# J2512827).
- qcc, q++
The -x option doesn't correctly specify the extension of subsequent files. (Ref# J2765557)
Workaround: Use qcc for C files, and q++ for C++ files.
- slogger2
-
You can't currently use pps to change slogger2's level of verbosity. (Ref# J2877932)
If you slay and restart it doesn't delete old shared memory logs. (Ref# J2761539)
Workaround: A privileged user could list the entries under /dev/shmem/slogger2/ and delete them by hand.
Known issues: C library
- <limits.h>
The definition of USHRT_MAX is incorrect; it should be as follows:
#if __INT_BITS__-0 <= 16 #define USHRT_MAX 65535U /* maximum value of an unsigned short */ #else #define USHRT_MAX 65535 /* maximum value of an unsigned short */ #endif
(Ref# J2753844, J2753845)
- posix_typed_mem_open()
- If you don't specify a leading slash in the name and you aren't in the
root directory, posix_typed_mem_open() fails to open the typed memory object.
(Ref# J1035253)
Workaround: Start the name with a slash.
- shm_ctl_special()
Specifying the ARM_SHMCTL_SO bit in the special argument should result in strongly ordered mappings but currently doesn't. (Ref# J2740401)
Workaround: Also set ARM_SHMCTL_SH. Adding this bit results in strongly ordered mappings and doesn't remove functionality because non-cacheable mappings are always outer-shareable (i.e., you can't get a non-shareable non-cacheable mapping anyway).
- tc*()
- Some tc*() (terminal interface) functions are implemented as having cancellation points when according to POSIX,
they must not or should not have them. This issue is being fixed in a newer version of QNX SDP.
The terminal interface functions that incorrectly do have cancellation points include:
- tcdrain()
- tcgetsid()
- tcsetsize()
- tcgetsize()
- tcinject()
- tcischars()
In the documentation, the safety table for each listed function has a No value in the Cancellation point column. This should be used as a guideline in writing programs that use these functions; they should not be used as cancellation points.
(Ref# J2711220)
- timespec2nsec()
- In <time.h>,
there's a macro named timespec2nsec(), which gets called instead of the C Library function with
the same name and method signature. In this release, the macro implementation has unexpected behavior sometimes because
it evaluates its argument twice. So, code that would be valid for calling the C function is not valid for calling the macro.
(Ref# J2642295)
Workaround: For the argument, avoid using code that may have a different meaning or become undefined when evaluated for the second time. An example would be using increment or decrement operators in an array index that references a timespec structure, as in the following statement:
timespec2nsec((struct timespec*)attribList[i++]);
- vfork()
- This function is a leftover from previous releases and is now deprecated; don't use it:
If you call vfork() on an x86_64 target, and the child then calls exec*(), the kernel might crash. (Ref# J2769992)
- If you call vfork() in a multithreaded process, the child may hang trying to acquire a forksafe mutex. (Ref# J2743907)
Workaround: Use posix_spawn() instead.
Technical support
To obtain technical support for any QNX product, visit the Support area on our website (www.qnx.com). You'll find a wide range of support options, including community forums.
For questions about installing and using QNX SDP, see the Getting Started forum on our Foundry27 site, http://community.qnx.com. There are other forums for specific topics, including the QNX Neutrino RTOS, development tools, networking, Board Support Packages, and so on.