@@ -189,30 +189,37 @@ func TestElfBindNow(t *testing.T) {
189
189
testenv .MustHaveGoBuild (t )
190
190
testenv .MustInternalLink (t , false )
191
191
192
- const prog = `package main; import _ "net"; func main() {}`
192
+ const (
193
+ prog = `package main; func main() {}`
194
+ prog_C = `package main; import "C"; func main() {}`
195
+ )
193
196
194
197
tests := []struct {
195
198
name string
196
199
args []string
200
+ prog string
197
201
wantDf1Now bool
198
202
wantDf1Pie bool
199
203
wantDfBindNow bool
200
204
}{
201
- {name : "default" },
205
+ {name : "default" , prog : prog },
202
206
{
203
207
name : "pie" ,
204
- args : []string {"-buildmode=pie" },
208
+ args : []string {"-buildmode=pie" , "-ldflags" , "-linkmode=internal" },
209
+ prog : prog ,
205
210
wantDf1Pie : true ,
206
211
},
207
212
{
208
213
name : "bindnow" ,
209
- args : []string {"-ldflags" , "-bindnow" },
214
+ args : []string {"-ldflags" , "-bindnow -linkmode=internal" },
215
+ prog : prog_C ,
210
216
wantDf1Now : true ,
211
217
wantDfBindNow : true ,
212
218
},
213
219
{
214
220
name : "bindnow-pie" ,
215
- args : []string {"-buildmode=pie" , "-ldflags" , "-bindnow" },
221
+ args : []string {"-buildmode=pie" , "-ldflags" , "-bindnow -linkmode=internal" },
222
+ prog : prog ,
216
223
wantDf1Now : true ,
217
224
wantDf1Pie : true ,
218
225
wantDfBindNow : true ,
@@ -230,61 +237,59 @@ func TestElfBindNow(t *testing.T) {
230
237
}
231
238
232
239
for _ , test := range tests {
233
- t .Run (
234
- test .name , func (t * testing.T ) {
235
- var (
236
- gotDfBindNow , gotDf1Now , gotDf1Pie bool
237
-
238
- dir = t .TempDir ()
239
- src = filepath .Join (dir , fmt .Sprintf ("elf_%s.go" , test .name ))
240
- binFile = filepath .Join (dir , test .name )
241
- )
242
-
243
- if err := os .WriteFile (src , []byte (prog ), 0666 ); err != nil {
244
- t .Fatal (err )
245
- }
246
-
247
- cmdArgs := append ([]string {"build" , "-o" , binFile }, append (test .args , src )... )
248
- cmd := testenv .Command (t , testenv .GoToolPath (t ), cmdArgs ... )
249
-
250
- if out , err := cmd .CombinedOutput (); err != nil {
251
- t .Fatalf ("%v: %v:\n %s" , cmd .Args , err , out )
252
- }
253
-
254
- fi , err := os .Open (binFile )
255
- if err != nil {
256
- t .Fatalf ("failed to open built file: %v" , err )
257
- }
258
- defer fi .Close ()
259
-
260
- elfFile , err := elf .NewFile (fi )
261
- if err != nil {
262
- t .Skip ("The system may not support ELF, skipped." )
263
- }
264
- defer elfFile .Close ()
265
-
266
- flags , err := elfFile .DynValue (elf .DT_FLAGS )
267
- if err != nil {
268
- t .Fatalf ("failed to get DT_FLAGS: %v" , err )
269
- }
270
-
271
- flags1 , err := elfFile .DynValue (elf .DT_FLAGS_1 )
272
- if err != nil {
273
- t .Fatalf ("failed to get DT_FLAGS_1: %v" , err )
274
- }
275
-
276
- if gotDfBindNow = gotDynFlag (flags , uint64 (elf .DF_BIND_NOW )); gotDfBindNow != test .wantDfBindNow {
277
- t .Fatalf ("DT_FLAGS BIND_NOW flag is %v, want: %v" , gotDfBindNow , test .wantDfBindNow )
278
- }
279
-
280
- if gotDf1Now = gotDynFlag (flags1 , uint64 (elf .DF_1_NOW )); gotDf1Now != test .wantDf1Now {
281
- t .Fatalf ("DT_FLAGS_1 DF_1_NOW flag is %v, want: %v" , gotDf1Now , test .wantDf1Now )
282
- }
283
-
284
- if gotDf1Pie = gotDynFlag (flags1 , uint64 (elf .DF_1_PIE )); gotDf1Pie != test .wantDf1Pie {
285
- t .Fatalf ("DT_FLAGS_1 DF_1_PIE flag is %v, want: %v" , gotDf1Pie , test .wantDf1Pie )
286
- }
287
- },
288
- )
240
+ t .Run (test .name , func (t * testing.T ) {
241
+ var (
242
+ gotDfBindNow , gotDf1Now , gotDf1Pie bool
243
+
244
+ dir = t .TempDir ()
245
+ src = filepath .Join (dir , fmt .Sprintf ("elf_%s.go" , test .name ))
246
+ binFile = filepath .Join (dir , test .name )
247
+ )
248
+
249
+ if err := os .WriteFile (src , []byte (test .prog ), 0666 ); err != nil {
250
+ t .Fatal (err )
251
+ }
252
+
253
+ cmdArgs := append ([]string {"build" , "-o" , binFile }, append (test .args , src )... )
254
+ cmd := testenv .Command (t , testenv .GoToolPath (t ), cmdArgs ... )
255
+
256
+ if out , err := cmd .CombinedOutput (); err != nil {
257
+ t .Fatalf ("failed to build %v: %v:\n %s" , cmd .Args , err , out )
258
+ }
259
+
260
+ fi , err := os .Open (binFile )
261
+ if err != nil {
262
+ t .Fatalf ("failed to open built file: %v" , err )
263
+ }
264
+ defer fi .Close ()
265
+
266
+ elfFile , err := elf .NewFile (fi )
267
+ if err != nil {
268
+ t .Skip ("The system may not support ELF, skipped." )
269
+ }
270
+ defer elfFile .Close ()
271
+
272
+ flags , err := elfFile .DynValue (elf .DT_FLAGS )
273
+ if err != nil {
274
+ t .Fatalf ("failed to get DT_FLAGS: %v" , err )
275
+ }
276
+
277
+ flags1 , err := elfFile .DynValue (elf .DT_FLAGS_1 )
278
+ if err != nil {
279
+ t .Fatalf ("failed to get DT_FLAGS_1: %v" , err )
280
+ }
281
+
282
+ if gotDfBindNow = gotDynFlag (flags , uint64 (elf .DF_BIND_NOW )); gotDfBindNow != test .wantDfBindNow {
283
+ t .Fatalf ("DT_FLAGS BIND_NOW flag is %v, want: %v" , gotDfBindNow , test .wantDfBindNow )
284
+ }
285
+
286
+ if gotDf1Now = gotDynFlag (flags1 , uint64 (elf .DF_1_NOW )); gotDf1Now != test .wantDf1Now {
287
+ t .Fatalf ("DT_FLAGS_1 DF_1_NOW flag is %v, want: %v" , gotDf1Now , test .wantDf1Now )
288
+ }
289
+
290
+ if gotDf1Pie = gotDynFlag (flags1 , uint64 (elf .DF_1_PIE )); gotDf1Pie != test .wantDf1Pie {
291
+ t .Fatalf ("DT_FLAGS_1 DF_1_PIE flag is %v, want: %v" , gotDf1Pie , test .wantDf1Pie )
292
+ }
293
+ })
289
294
}
290
295
}
0 commit comments