Skip to content

Commit 1cc0a47

Browse files
committed
picolibc.ld: Support _ prefixed global symbols
Meson.build had some support for systems that prefixed globals with underscore, but that didn't get propagated to the linker script. Signed-off-by: Keith Packard <[email protected]>
1 parent 7a81542 commit 1cc0a47

File tree

2 files changed

+82
-78
lines changed

2 files changed

+82
-78
lines changed

meson.build

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,10 @@ endif
287287
tinystdio = get_option('tinystdio')
288288

289289
has_link_defsym = meson.get_cross_property('has_link_defsym',
290-
cc.has_link_argument('-Wl,--defsym=' + global_prefix + '_start=0') or
291-
cc.has_link_argument('-Wl,--defsym=' + global_prefix + '__start=0') )
290+
cc.has_link_argument('-Wl,--defsym=' + 'start=0') or
291+
cc.has_link_argument('-Wl,--defsym=' + '_start=0') or
292+
cc.has_link_argument('-Wl,--defsym=' + '__start=0') or
293+
cc.has_link_argument('-Wl,--defsym=' + '___start=0') )
292294
has_link_alias = meson.get_cross_property('has_link_alias', cc.has_link_argument('-Wl,-alias,' + global_prefix + 'main,testalias'))
293295
lib_gcc = meson.get_cross_property('libgcc', '-lgcc')
294296

@@ -611,16 +613,16 @@ endif
611613

612614
specs_printf = ''
613615
if tinystdio and printf_aliases
614-
specs_printf=('%{DPICOLIBC_DOUBLE_PRINTF_SCANF:--defsym=vfprintf=__d_vfprintf}' +
615-
' %{DPICOLIBC_DOUBLE_PRINTF_SCANF:--defsym=vfscanf=__d_vfscanf}' +
616-
' %{DPICOLIBC_FLOAT_PRINTF_SCANF:--defsym=vfprintf=__f_vfprintf}' +
617-
' %{DPICOLIBC_FLOAT_PRINTF_SCANF:--defsym=vfscanf=__f_vfscanf}' +
618-
' %{DPICOLIBC_LONG_LONG_PRINTF_SCANF:--defsym=vfprintf=__l_vfprintf}' +
619-
' %{DPICOLIBC_LONG_LONG_PRINTF_SCANF:--defsym=vfscanf=__l_vfscanf}' +
620-
' %{DPICOLIBC_INTEGER_PRINTF_SCANF:--defsym=vfprintf=__i_vfprintf}' +
621-
' %{DPICOLIBC_INTEGER_PRINTF_SCANF:--defsym=vfscanf=__i_vfscanf}' +
622-
' %{DPICOLIBC_MINIMAL_PRINTF_SCANF:--defsym=vfprintf=__m_vfprintf}' +
623-
' %{DPICOLIBC_MINIMAL_PRINTF_SCANF:--defsym=vfscanf=__m_vfscanf}')
616+
specs_printf=('%{DPICOLIBC_DOUBLE_PRINTF_SCANF:--defsym=vfprintf=' + __d_vfprintf_symbol + '}' +
617+
' %{DPICOLIBC_DOUBLE_PRINTF_SCANF:--defsym=vfscanf=' + __d_vfscanf_symbol + '}' +
618+
' %{DPICOLIBC_FLOAT_PRINTF_SCANF:--defsym=vfprintf=' + __f_vfprintf_symbol + '}' +
619+
' %{DPICOLIBC_FLOAT_PRINTF_SCANF:--defsym=vfscanf=' + __f_vfscanf_symbol + '}' +
620+
' %{DPICOLIBC_LONG_LONG_PRINTF_SCANF:--defsym=vfprintf=' + __l_vfprintf_symbol + '}' +
621+
' %{DPICOLIBC_LONG_LONG_PRINTF_SCANF:--defsym=vfscanf=' + __l_vfscanf_symbol + '}' +
622+
' %{DPICOLIBC_INTEGER_PRINTF_SCANF:--defsym=vfprintf=' + __i_vfprintf_symbol + '}' +
623+
' %{DPICOLIBC_INTEGER_PRINTF_SCANF:--defsym=vfscanf=' + __i_vfscanf_symbol + '}' +
624+
' %{DPICOLIBC_MINIMAL_PRINTF_SCANF:--defsym=vfprintf=' + __m_vfprintf_symbol + '}' +
625+
' %{DPICOLIBC_MINIMAL_PRINTF_SCANF:--defsym=vfscanf=' + __m_vfscanf_symbol + '}')
624626
endif
625627

626628
crt0_expr = '%{-crt0=*:crt0-%*%O%s; :crt0%O%s}'
@@ -1146,6 +1148,7 @@ foreach target : ['default-target'] + targets
11461148
picolibc_ld_data.set('CPP_END', '*/')
11471149
picolibc_ld_data.set('C_START', '')
11481150
picolibc_ld_data.set('C_END', '')
1151+
picolibc_ld_data.set('PREFIX', global_prefix)
11491152

11501153
if target == 'default-target'
11511154
picolibc_ld_file = 'picolibc.ld'
@@ -1182,6 +1185,7 @@ foreach target : ['default-target'] + targets
11821185
picolibcpp_ld_data.set('CPP_END', '')
11831186
picolibcpp_ld_data.set('C_START', '/*')
11841187
picolibcpp_ld_data.set('C_END', '*/')
1188+
picolibcpp_ld_data.set('PREFIX', global_prefix)
11851189

11861190
if not is_variable(picolibcpp_ld_config_variable)
11871191
set_variable(picolibcpp_ld_config_variable,

picolibc.ld.in

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* OF THE POSSIBILITY OF SUCH DAMAGE.
3434
*/
3535

36-
ENTRY(_start)
36+
ENTRY(@PREFIX@_start)
3737

3838
/*
3939
* These values should be provided by the application. We'll include
@@ -43,11 +43,11 @@ ENTRY(_start)
4343
MEMORY
4444
{@INIT_MEMORY@
4545
flash (rx!w) :
46-
ORIGIN = DEFINED(__flash) ? __flash : @DEFAULT_FLASH_ADDR@,
47-
LENGTH = DEFINED(__flash_size) ? __flash_size : @DEFAULT_FLASH_SIZE@
46+
ORIGIN = DEFINED(@PREFIX@__flash) ? @PREFIX@__flash : @DEFAULT_FLASH_ADDR@,
47+
LENGTH = DEFINED(@PREFIX@__flash_size) ? @PREFIX@__flash_size : @DEFAULT_FLASH_SIZE@
4848
ram (w!rx) :
49-
ORIGIN = DEFINED(__ram) ? __ram : @DEFAULT_RAM_ADDR@,
50-
LENGTH = DEFINED(__ram_size) ? __ram_size : @DEFAULT_RAM_SIZE@
49+
ORIGIN = DEFINED(@PREFIX@__ram) ? @PREFIX@__ram : @DEFAULT_RAM_ADDR@,
50+
LENGTH = DEFINED(@PREFIX@__ram_size) ? @PREFIX@__ram_size : @DEFAULT_RAM_SIZE@
5151
}
5252

5353
PHDRS
@@ -60,7 +60,7 @@ PHDRS
6060

6161
SECTIONS
6262
{
63-
PROVIDE(__stack = ORIGIN(ram) + LENGTH(ram));
63+
PROVIDE(@PREFIX@__stack = ORIGIN(ram) + LENGTH(ram));
6464
@INIT_SECTIONS@
6565
.text : {
6666

@@ -70,11 +70,11 @@ SECTIONS
7070
*(.text .text.* .opd .opd.*)
7171
*(.gnu.linkonce.t.*)
7272
KEEP (*(.fini .fini.*))
73-
__text_end = .;
73+
@PREFIX@__text_end = .;
7474

75-
PROVIDE (__etext = __text_end);
76-
PROVIDE (_etext = __text_end);
77-
PROVIDE (etext = __text_end);
75+
PROVIDE (@PREFIX@__etext = @PREFIX@__text_end);
76+
PROVIDE (@PREFIX@_etext = @PREFIX@__text_end);
77+
PROVIDE (@PREFIX@etext = @PREFIX@__text_end);
7878
} >flash AT>flash :text
7979

8080
.rodata : {
@@ -97,19 +97,19 @@ SECTIONS
9797
. = ALIGN(@DEFAULT_ALIGNMENT@);
9898

9999
/* lists of constructors and destructors */
100-
PROVIDE_HIDDEN ( __preinit_array_start = . );
100+
PROVIDE_HIDDEN ( @PREFIX@__preinit_array_start = . );
101101
KEEP (*(.preinit_array))
102-
PROVIDE_HIDDEN ( __preinit_array_end = . );
102+
PROVIDE_HIDDEN ( @PREFIX@__preinit_array_end = . );
103103

104-
PROVIDE_HIDDEN ( __init_array_start = . );
104+
PROVIDE_HIDDEN ( @PREFIX@__init_array_start = . );
105105
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
106106
KEEP (*(.init_array .ctors))
107-
PROVIDE_HIDDEN ( __init_array_end = . );
107+
PROVIDE_HIDDEN ( @PREFIX@__init_array_end = . );
108108

109-
PROVIDE_HIDDEN ( __fini_array_start = . );
109+
PROVIDE_HIDDEN ( @PREFIX@__fini_array_start = . );
110110
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
111111
KEEP (*(.fini_array .dtors))
112-
PROVIDE_HIDDEN ( __fini_array_end = . );
112+
PROVIDE_HIDDEN ( @PREFIX@__fini_array_end = . );
113113

114114
} >flash AT>flash :text
115115

@@ -134,33 +134,33 @@ SECTIONS
134134
*(.ARM.extab* .gnu.linkonce.armextab.*)
135135
} >flash AT>flash :text
136136
.eh_frame_hdr : {
137-
PROVIDE_HIDDEN ( __eh_frame_hdr_start = . );
137+
PROVIDE_HIDDEN ( @PREFIX@__eh_frame_hdr_start = . );
138138
*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*)
139-
PROVIDE_HIDDEN ( __eh_frame_hdr_end = . );
139+
PROVIDE_HIDDEN ( @PREFIX@__eh_frame_hdr_end = . );
140140
} >flash AT>flash :text
141141
.eh_frame : {
142-
PROVIDE_HIDDEN ( __eh_frame_start = . );
142+
PROVIDE_HIDDEN ( @PREFIX@__eh_frame_start = . );
143143
KEEP (*(.eh_frame .eh_frame.*))
144-
PROVIDE_HIDDEN ( __eh_frame_end = . );
144+
PROVIDE_HIDDEN ( @PREFIX@__eh_frame_end = . );
145145
} >flash AT>flash :text
146146

147147
.except_unordered : {
148148
. = ALIGN(@DEFAULT_ALIGNMENT@);
149149

150-
PROVIDE(__exidx_start = .);
150+
PROVIDE(@PREFIX@__exidx_start = .);
151151
*(.ARM.exidx*)
152-
PROVIDE(__exidx_end = .);
152+
PROVIDE(@PREFIX@__exidx_end = .);
153153
} >flash AT>flash :text
154154
@CPP_END@
155155

156156
/*
157157
* Data values which are preserved across reset
158158
*/
159159
.preserve (NOLOAD) : {
160-
PROVIDE(__preserve_start__ = .);
160+
PROVIDE(@PREFIX@__preserve_start__ = .);
161161
KEEP(*(SORT_BY_NAME(.preserve.*)))
162162
KEEP(*(.preserve))
163-
PROVIDE(__preserve_end__ = .);
163+
PROVIDE(@PREFIX@__preserve_end__ = .);
164164
} >ram AT>ram :ram
165165

166166
.data : @BFD_START@ ALIGN_WITH_INPUT @BFD_END@ {
@@ -170,13 +170,13 @@ SECTIONS
170170
/* Need to pre-align so that the symbols come after padding */
171171
. = ALIGN(@DEFAULT_ALIGNMENT@);
172172

173-
PROVIDE( __global_pointer$ = . + 0x800 );
174-
PROVIDE( _gp = . + 0x8000);
173+
PROVIDE( @PREFIX@__global_pointer$ = . + 0x800 );
174+
PROVIDE( @PREFIX@_gp = . + 0x8000);
175175
*(.sdata .sdata.* .sdata2.*)
176176
*(.gnu.linkonce.s.*)
177177
} >ram AT>flash :ram_init
178-
PROVIDE(__data_start = ADDR(.data));
179-
PROVIDE(__data_source = LOADADDR(.data));
178+
PROVIDE(@PREFIX@__data_start = ADDR(.data));
179+
PROVIDE(@PREFIX@__data_source = LOADADDR(.data));
180180

181181
/* Thread local initialized data. This gets
182182
* space allocated as it is expected to be placed
@@ -190,39 +190,39 @@ SECTIONS
190190
* as it only guarantees usage as a TLS template works
191191
* rather than supporting this use case.
192192
*/
193-
.tdata : @LLD_START@ ALIGN(__tls_align) @LLD_END@ @BFD_START@ ALIGN_WITH_INPUT @BFD_END@ {
193+
.tdata : @LLD_START@ ALIGN(@PREFIX@__tls_align) @LLD_END@ @BFD_START@ ALIGN_WITH_INPUT @BFD_END@ {
194194
*(.tdata .tdata.* .gnu.linkonce.td.*)
195-
PROVIDE(__data_end = .);
196-
PROVIDE(__tdata_end = .);
195+
PROVIDE(@PREFIX@__data_end = .);
196+
PROVIDE(@PREFIX@__tdata_end = .);
197197
} >ram AT>flash :tls :ram_init
198-
PROVIDE( __tls_base = ADDR(.tdata));
199-
PROVIDE( __tdata_start = ADDR(.tdata));
200-
PROVIDE( __tdata_source = LOADADDR(.tdata) );
201-
PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
202-
PROVIDE( __data_source_end = __tdata_source_end );
203-
PROVIDE( __tdata_size = SIZEOF(.tdata) );
204-
205-
PROVIDE( __edata = __data_end );
206-
PROVIDE( _edata = __data_end );
207-
PROVIDE( edata = __data_end );
208-
PROVIDE( __data_size = __data_end - __data_start );
209-
PROVIDE( __data_source_size = __data_source_end - __data_source );
198+
PROVIDE( @PREFIX@__tls_base = ADDR(.tdata));
199+
PROVIDE( @PREFIX@__tdata_start = ADDR(.tdata));
200+
PROVIDE( @PREFIX@__tdata_source = LOADADDR(.tdata) );
201+
PROVIDE( @PREFIX@__tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
202+
PROVIDE( @PREFIX@__data_source_end = @PREFIX@__tdata_source_end );
203+
PROVIDE( @PREFIX@__tdata_size = SIZEOF(.tdata) );
204+
205+
PROVIDE( @PREFIX@__edata = @PREFIX@__data_end );
206+
PROVIDE( @PREFIX@_edata = @PREFIX@__data_end );
207+
PROVIDE( @PREFIX@edata = @PREFIX@__data_end );
208+
PROVIDE( @PREFIX@__data_size = @PREFIX@__data_end - @PREFIX@__data_start );
209+
PROVIDE( @PREFIX@__data_source_size = @PREFIX@__data_source_end - @PREFIX@__data_source );
210210

211211
.tbss (NOLOAD) : {
212212
*(.tbss .tbss.* .gnu.linkonce.tb.*)
213213
*(.tcommon)
214-
PROVIDE( __tls_end = . );
215-
PROVIDE( __tbss_end = . );
214+
PROVIDE( @PREFIX@__tls_end = . );
215+
PROVIDE( @PREFIX@__tbss_end = . );
216216
} >ram AT>ram :tls :ram
217-
PROVIDE( __bss_start = ADDR(.tbss));
218-
PROVIDE( __tbss_start = ADDR(.tbss));
219-
PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
220-
PROVIDE( __tbss_size = SIZEOF(.tbss) );
221-
PROVIDE( __tls_size = __tls_end - __tls_base );
222-
PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
223-
PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1));
224-
PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
225-
PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
217+
PROVIDE( @PREFIX@__bss_start = ADDR(.tbss));
218+
PROVIDE( @PREFIX@__tbss_start = ADDR(.tbss));
219+
PROVIDE( @PREFIX@__tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
220+
PROVIDE( @PREFIX@__tbss_size = SIZEOF(.tbss) );
221+
PROVIDE( @PREFIX@__tls_size = @PREFIX@__tls_end - @PREFIX@__tls_base );
222+
PROVIDE( @PREFIX@__tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
223+
PROVIDE( @PREFIX@__tls_size_align = (@PREFIX@__tls_size + @PREFIX@__tls_align - 1) & ~(@PREFIX@__tls_align - 1));
224+
PROVIDE( @PREFIX@__arm32_tls_tcb_offset = MAX(8, @PREFIX@__tls_align) );
225+
PROVIDE( @PREFIX@__arm64_tls_tcb_offset = MAX(16, @PREFIX@__tls_align) );
226226

227227
/*
228228
* Unlike ld.lld, ld.bfd does not advance the location counter for
@@ -245,27 +245,27 @@ SECTIONS
245245

246246
/* Align the heap */
247247
. = ALIGN(@DEFAULT_ALIGNMENT@);
248-
__bss_end = .;
248+
@PREFIX@__bss_end = .;
249249
} >ram AT>ram :ram
250-
PROVIDE( __non_tls_bss_start = ADDR(.bss) );
251-
PROVIDE( __end = __bss_end );
252-
_end = __bss_end;
253-
PROVIDE( end = __bss_end );
254-
PROVIDE( __bss_size = __bss_end - __bss_start );
250+
PROVIDE( @PREFIX@__non_tls_bss_start = ADDR(.bss) );
251+
PROVIDE( @PREFIX@__end = @PREFIX@__bss_end );
252+
@PREFIX@_end = @PREFIX@__bss_end;
253+
PROVIDE( @PREFIX@end = @PREFIX@__bss_end );
254+
PROVIDE( @PREFIX@__bss_size = @PREFIX@__bss_end - @PREFIX@__bss_start );
255255

256256
/* Make the rest of memory available for heap storage */
257-
PROVIDE (__heap_start = __end);
258-
PROVIDE (__heap_end = __stack - (DEFINED(__stack_size) ? __stack_size : @DEFAULT_STACK_SIZE@));
259-
PROVIDE (__heap_size = __heap_end - __heap_start);
257+
PROVIDE (@PREFIX@__heap_start = @PREFIX@__end);
258+
PROVIDE (@PREFIX@__heap_end = @PREFIX@__stack - (DEFINED(@PREFIX@__stack_size) ? @PREFIX@__stack_size : @DEFAULT_STACK_SIZE@));
259+
PROVIDE (@PREFIX@__heap_size = @PREFIX@__heap_end - @PREFIX@__heap_start);
260260

261261
/* Allow a minimum heap size to be specified */
262262
.heap (NOLOAD) : {
263-
. += (DEFINED(__heap_size_min) ? __heap_size_min : 0);
263+
. += (DEFINED(@PREFIX@__heap_size_min) ? @PREFIX@__heap_size_min : 0);
264264
} >ram :ram
265265

266266
/* Define a stack region to make sure it fits in memory */
267267
.stack (NOLOAD) : {
268-
. += (DEFINED(__stack_size) ? __stack_size : @DEFAULT_STACK_SIZE@);
268+
. += (DEFINED(@PREFIX@__stack_size) ? @PREFIX@__stack_size : @DEFAULT_STACK_SIZE@);
269269
} >ram :ram
270270

271271
/* Throw away C++ exception handling information */
@@ -333,5 +333,5 @@ SECTIONS
333333
* Check that sections that are copied from flash to RAM have matching
334334
* padding, so that a single memcpy() of __data_size copies the correct bytes.
335335
*/
336-
ASSERT( __data_size == __data_source_size,
336+
ASSERT( @PREFIX@__data_size == @PREFIX@__data_source_size,
337337
"ERROR: .data/.tdata flash size does not match RAM size");

0 commit comments

Comments
 (0)